Wenn Sie dem domänengesteuerten Entwurf (Domain-driven Design, DDD) folgen, ist es richtig, wenn ein Stammaggregat einen Verweis auf eine interne Entität enthält, die zufällig die Stammentität in einem separaten Aggregat ist?
Ich glaube, das ist nicht richtig, hauptsächlich wegen dieser Regel im Blue Book :
Nichts außerhalb der AGGREGATE-Grenze kann einen Verweis auf irgendetwas innerhalb enthalten, außer auf die Root-ENTITY. Die Stamm-ENTITÄT kann Verweise auf die internen ENTITÄTEN an andere Objekte übergeben, diese Objekte können sie jedoch nur vorübergehend verwenden, und sie können die Referenz möglicherweise nicht festhalten. Der Root kann eine Kopie eines VALUE OBJECT an ein anderes Objekt übergeben, und es spielt keine Rolle, was damit passiert, da es sich nur um einen VALUE handelt und keine Verbindung mehr zum AGGREGATE besteht.
Wenn ein Root-Aggregat einen Verweis auf ein anderes Root-Aggregat enthält, wird die Grenze des ersteren verletzt und das gesamte Konzept eines Aggregats wird beschädigt. Ich glaube also, dass ein Root-Aggregat einen Verweis auf ein anderes Root-Aggregat enthalten muss um eine andere Entität zu erstellen , die wahrscheinlich dieselben Mitglieder wie die andere Stammentität hat, aber keine globale Identität besitzt, wie diese andere Regel im Buch besagt:
Root ENTITIES haben eine globale Identität. ENTITÄTEN innerhalb der Grenze haben eine lokale Identität, die nur innerhalb des AGGREGATES eindeutig ist.
Ich glaube, dies wäre der richtige Weg, aber da er sich wiederholt und überflüssig anfühlt (aus dem DDD-Kontext herausgenommen, mit reinem OOP), bitte ich um Feedback.
quelle
Antworten:
Möglicherweise haben Sie das Buch überinterpretiert. Grundsätzlich heißt es: Alles außerhalb eines Aggregats kann keinen Verweis auf irgendetwas in ihm enthalten, außer auf die Wurzel. Daher ist es legitim, einen Verweis auf eine Wurzel zu haben. Wenn Sie eine Referenz auf eine Wurzel halten, bedeutet dies nicht, dass sie Teil Ihres eigenen Aggregats ist und dass Sie deren Invarianten steuern können. Es behält seine eigenen Invarianten und Autonomie.
Jedoch,
Das passiert nie. Ein Wertobjekt kann Teil mehrerer Aggregate sein, jedoch keine Entität. Der Grund dafür ist, nichts würde man dann verhindern , dass die gleiche Person teilt Instanz zwischen Aggregates. Angenommen, die Entitätsinstanz E gehört zu beiden Aggregatinstanzen A und B. Da DDD voraussetzt, dass das Aggregat der Einstiegspunkt ist, können Sie A laden, die Entität E dadurch ändern und dabei unbemerkt Invarianten von verletzen B (dass Sie nicht geladen haben).
Die Antwort von Greg Young finden Sie hier: http://domain-driven-design.3010926.n2.nabble.com/Can-an-Entity-be-Shared-across-many-Aggregates-td7579277.html
quelle
holding a reference
in diesem Zusammenhang bedeutet? weil ich verwirrt war, als Sie das sagten:holding a reference to a root is legit
danach sagten Sie:This never happens. A Value Object can be part of multiple Aggregates, but not an Entity. The reason is, nothing would then prevent you from sharing the same entity instance between Aggregates.
id
interne Entität (nicht-root) in einem anderen Aggregat zu belassen, oder dies verstößt gegen ob (root oder nicht)?Ihr aggregiertes Stammobjekt sollte (im Allgemeinen) nur Eigenschaften haben, die Teil seiner Domäne sind.
Wenn Sie ein AR-Objekt mit einer Eigenschaft haben, die sich nicht im Aggregat befindet, werden Sie sofort mit der Frage konfrontiert. 'Warum nicht?'
Könnten Sie vielleicht die ID des anderen Objekts hinzufügen? Oder ein Repository injizieren?
Es klingt jedoch so, als ob Sie einen domänenübergreifenden Dienst hinzufügen sollten, der auf beide Stammobjekte verweist und die erforderliche Logik ausführt
quelle