DDD - Wie man Assoziationen zwischen verschiedenen begrenzten Kontexten gestaltet

8

Ich habe ein Domänenprojekt eingerichtet, das mit einem ORM gefüllt wird. Die Domäne enthält verschiedene Aggregate mit jeweils einem eigenen Root-Objekt. Meine Frage ist, wie Eigenschaften, die die Aggregatgrenzen überschreiten, behandelt werden sollten?

  • Sollten diese Eigenschaften die Grenzen einfach ignorieren, so dass ein Domänenobjekt im beschränkten Kontext A einen Verweis auf ein Objekt im Kontext B hat?
  • Oder sollte es keine direkte Verbindung von Kontext A zu B geben und besitzt das Objekt in Kontext A eine Eigenschaft "int ContextBId", die verwendet werden kann, um das Domänenobjekt von B durch die B-Aggregatwurzel zu bekommen?
  • Oder ...

Ein Beispiel:
Kontext A = Benutzer
Kontext B = Spiele

Innerhalb des Kontexts Users befindet sich ein Objekt UserOwnedGames . Dieses Objekt hat eine Eigenschaft User , die eine Referenz auf ein Objekt im selben Users -Kontext ist. Das Objekt hat auch eine Eigenschaft für Game , die offensichtlich nicht in den Benutzern, sondern im Games -Kontext liegt.

Wie würde (oder sollte?) diese Beziehung aussehen? Es ist klar in der Datenbank (dh 2 Fremdschlüssel) aber wie soll der Code aussehen?

    
Laoujin 12.09.2013, 09:52
quelle

3 Antworten

15

Es klingt, als ob Ihr User -Kontext auch eine Game -Entität benötigt. Beachten Sie jedoch, dass dies nicht unbedingt dieselbe Game -Entität ist, die die Wurzel des Game -Kontexts ist. Diese zwei beschränkten Kontexte können unterschiedliche Vorstellungen davon haben, was ein Game ist und welche Eigenschaften es hat. Nur die Identität verbindet die beiden Game-Objekte miteinander.

%Vor%     
MattDavey 12.09.2013, 13:55
quelle
3

Sie sollten DB-Referenzen in BCs vermeiden. Sie sollten nicht versuchen, die referenzielle Integrität zwischen Aggregaten aus verschiedenen BCs (Transaktionen) sicherzustellen. Idealerweise sollte die Transaktion nur innerhalb eines einzelnen Aggregats, nicht einmal BC, stattfinden.

Bessere einfache Wertobjekte für IDs - UserId und GameId - verwenden und diese bei Bedarf der Entität zuweisen. Auf diese Weise sind diese "entfernten" Einheiten vollständig getrennt, so dass Sie sich keine Sorgen um ihre Verbindung machen müssen. Die Synchronisierung könnte mithilfe der Messaging-Plattform implementiert werden.

Wenn Sie Freizeit haben, lesen Sie diese wertvollen Artikel (von Vaughn Vernon):

gseric 12.09.2013 13:31
quelle
1

Es hängt davon ab, welche beschränkte Kontext-Strategie Sie verwenden.

Wenn Sie shared kernal wählen, denke ich, dass es in Ordnung ist, eine direkte Beziehung zwischen ihnen zu haben (direkte Referenz oder Bezeichner-Referenz, ich glaube, jemand anderes wird die Vor- und Nachteile in anderen Antworten erklären). und Sie haben auch diese Objekte erwähnt, die von Datenbanktabellen integriert sind.

Aber wenn Sie Anti-Korruptions-Schicht wählen, sollten Sie sie besser trennen (verwenden Sie nur Bezeichner, um die Beziehung beizubehalten), verwenden Sie Adapter-Übersetzer zur Integration (und keine Datenbank-Integration).

    
Hippoom 12.09.2013 13:12
quelle