Erstens: Wäre mein Entwurf falsch mit einer Aggregatwurzel in einer anderen?
Ja.
AGGREGATE Ein Cluster von zugeordneten Objekten, die als Einheit zum Zwecke der Datenänderungen behandelt. Externe Referenzen sind auf ein Mitglied des Aggregats beschränkt, das als Root bezeichnet wird. Eine Reihe von Konsistenzregeln gilt innerhalb der Grenzen des Aggregats.
Eric Evans, Domain Driven Design
Das Problem Ihr Design ist diese Gesichter: das Aggregat Partner kann seine eigene invariant nicht schützen, wenn der Nutzer Aggregat unabhängig den gleichen Zustand ändern darf.
Wenn in Ihrem Design, Sie behaupten, dass X ein Aggregat ist, zwei Ansprüche machen
- Die Gültigkeit der zu X Änderung kann ohne Rücksprache mit beliebigen externen Zustand bestimmt werden.
- Die Gültigkeit einer externen Änderung kann ohne Rücksprache mit dem Zustand von X.
Das ist die Gesamtgrenze bestimmt werden - auf der Außenseite Änderungen nicht nach innen schauen müssen, innerhalb Änderungen müssen nicht Schau hinaus.
Daher ist das Verschachteln von Aggregaten ein Widerspruch. Eine andere Möglichkeit, die gleiche Idee auszudrücken: Wenn ein Aggregatstamm in einem anderen ist, dann haben Sie ein Aggregat (das Partneraggregat), das zwei Wurzeln (die Partnerentität und die Benutzerentität) hat, was genau ist die Situation, die das Gesamtmuster vermeiden soll.
Mögliche Abhilfen:
Einer ist, dass der Nutzer Einheit wirklich Teil des Partner Aggregat ist. Jede Änderung an dem Benutzer soll vom Partner verwaltet werden. Sie verschieben den Benutzer zurück in das Partneraggregat und verhindern, dass Ihre Implementierung darauf zugreift, außer indem Befehle an den Aggregatstamm gesendet werden.
Eine andere ist, dass der Benutzer Einheit nicht Teil des Partneraggregats ist. Dann eliminieren Sie die direkte Referenz im Partner; dies kann bedeuten, dass die Referenz vollständig entfernt wird (wenn die Geschäftsregeln von Partner überhaupt nicht vom Benutzer abhängig sind) oder dass ein Verweis auf die Benutzer-ID und Geschäftsregeln vorhanden ist, die die ID überprüfen, ohne ihr zu folgen (mit anderen Worten: Ihre Regeln überprüfen möglicherweise, ob eine ID-Referenz null/nicht null ist oder/ist kein Mitglied einer Sammlung.Wenn Sie darüber nachdenken, kann das Partneraggregat nicht einmal feststellen, ob der Benutzer, auf den es verweist, existiert.
Ein dritter Punkt ist die Entdeckung einer neuen Entität in Ihrem Modell, die den Teil des Benutzers enthält, den das Partneraggregat tatsächlich für die Validierung verwendet. Dies könnte eine Momentaufnahme des Benutzerstatus sein, oder es könnte ein Refactoring des Benutzers in mehrere Teile sein.
Mögliche Duplikat [DDD die die Wurzel Aggregate Wurzel?] (Http://stackoverflow.com/questions/34423613/ddd-which-is-the-root-aggregate-root) – theDmi