Möglicherweise möchten Sie den Lagerbestand auf der Webseite anzeigen oder die Editionsnummer des vorrätigen Inventars anzeigen (stellen Sie sich vor, Ihr Inventar besteht aus Büchern, Zeitschriften usw.). Diese Informationen stammen aus der Inventardomäne.
An dieser Stelle ist vor allem zu beachten, dass es sich um eine Ansicht handelt, dh, die Verwendung veralteter Daten ist akzeptabel.
Davon abgesehen müssen Sie nicht mit den Aggregaten interagieren (die dafür verantwortlich sind, dass Änderungen nicht gegen die Geschäftsinvariante verstoßen), sondern mit einer Darstellung einer aktuellen Kopie des Status des Aggregats.
Was ich normalerweise erwarten würde, ist eine Abfrage, die für den Produktkatalog ausgeführt wird, und eine weitere, die für das Inventar ausgeführt wird, und etwas, um die beiden in dem DTO zusammenzufassen, das Sie zur Unterstützung der Ansicht benötigen.
Laden Sie sowohl die Produktdomänen- als auch die Inventardomänenaggregate?
Das ist also nah . Wir müssen die Aggregate nicht laden, da wir nichts ändern werden. Aber wir brauchen ihren Zustand; also könnten wir das laden. Trotzdem würde ich normalerweise erwarten, dass die beiden Domänen in unterschiedlichen Prozessen ausgeführt werden. Daher würden wir beide anrufen und nicht beide laden.
Würden Sie einige Eigenschaften Ihrer Produktdomänenentität für die Anzahl auf Lager und die Edition auf Lager halten und dann Domänenereignisse verwenden, um diese zu aktualisieren, wenn die Inventarentität aktualisiert wird?
"Überquere nicht die Bäche. Es wäre schlecht."
Verwenden von Ereignissen zum Koordinieren von Informationen über Domänenkontexte hinweg: großartige Idee. Konzepte, die zu einer Domäne gehören, in eine andere verschieben: Gegenteil einer großartigen Idee, außer mehr.
Sie möchten die Domains sauber halten. Die Anwendungen , die mit den Domänen interagieren, sind nicht so wichtig. So ist es beispielsweise sinnvoll, dass die Inventaranwendung einen Dienst in der Produktanwendung aufruft, um einige produktspezifische Konzepte abzufragen, die einer Ansicht hinzugefügt werden sollen. Oder umgekehrt.
Ich kenne keinen Grund, warum eine einzelne Anwendung auf eine einzelne Domäne beschränkt werden muss. Solange es eine einzige Quelle der Wahrheit gibt, können Sie die Transaktionen nach Belieben verteilen.
Aber um dies zu überdenken, würden wir im obigen Beispiel möglicherweise 2 DB-Tabellen für den Produktkatalog und den Produktbestand haben. Verwenden wir in diesen dieselbe Kennung wie für dasselbe Produkt?
Das wäre der einfache Weg. In größeren Begriffen verwenden Sie denselben Bezeichner, da die reale Entität dieselbe ist. Die zwei verschiedenen begrenzten Kontexte modellieren diese Entität unterschiedlich, aber das Modell ist nicht die Entität der realen Welt.
Wenn das nicht funktioniert, benötigen Sie eine Abfrage, um die Lücke zu schließen. Ich denke, die häufigste Variante ist, dass die neuere Entität die ID der älteren Entität beibehält. Sie werden dies auch in einem einzigen BC sehen: Bewerber werden, wenn sie genehmigt werden, Kunden. Es ist ein anderes Aggregat (der einem Kunden zugeordnete Staat unterliegt einer anderen Invariante als der des Antragstellers); Wenn Ihre Persistenzschicht Ereignisströme verwendet, benötigt der Stream für das neue Aggregat eine andere Kennung. Es wird also irgendwo einen Staat geben, der besagt, dass "dieser Antragsteller dieser Kunde geworden ist".
Oder könnten wir 1 Tabelle und 1 Tabellenzeile für die Daten verwenden und die relevanten Daten einfach den Aggregateigenschaften zuordnen?
YIKES! Nein, tu das nicht. Sie fügen Transaktionskonflikte ohne geschäftlichen Grund hinzu.