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.
Ich denke, Ihre Frage erfordert wirklich 2 orthogonale Sätze von Optionen -
Laden Sie zwei Objekte und präsentieren Sie ihre Daten zusammen oder laden Sie ein Objekt, das alles enthält, was Sie wollen?
Verwenden Sie Aggregate zum Anzeigen von Inhalten oder etwas anderem?
Wenn Sie an den CQRS-Ansatz glauben, stellt sich heraus, dass Aggregate möglicherweise nicht die beste Wahl für Lesevorgänge sind. Jedes Mal, wenn Sie ein Aggregat laden, um seine Daten anzuzeigen oder zu ändern, fügen Sie Ihrem System Parallelität und Konflikte hinzu. Außerdem sind Aggregate möglicherweise sperriger und langsamer zu laden als bei Verwendung von Ad-hoc-Lesemodellen, die auf die Anzeige zugeschnitten sind.
Lösung a) aus Ihrem Q scheint vielen dieser Fallstricke zu unterliegen. Option b) kann gültig sein, aber ich würde sie nur verwenden, wenn Daten aus dem
InventoryManagement
BC benötigt werden, um Invarianten beim Mutieren desProduct
Aggregats zu erzwingen . Es ist besser, wenn ein Aggregat alle Daten enthält, die zur Überprüfung seiner Geschäftsregeln bei Änderungen erforderlich sind, aber auf der Leseseite können sie überall sitzen.In Bezug auf Daten wird häufig empfohlen, Bounded Contexts eine eigene Datenbank zuzuweisen (aus Gründen der Bereitstellbarkeit und des SoC). Sie müssen wahrscheinlich dieselben Bezeichner verwenden, wenn Sie Produkte zwischen den beiden BCs abgleichen möchten.
Informationen zu BC-übergreifenden Interaktionen finden Sie möglicherweise auch unter /programming/16713041/communicating-between-two-bounded-contexts-in-ddd
quelle
DDD ist für Anwendungen gedacht, bei denen die Geschäftslogik komplex ist. "etwas drucken" ist keine komplexe Geschäftslogik. Es ist eigentlich überhaupt keine Geschäftslogik.
Wenn die Geschäftslogik in einem Kontext einige Informationen benötigt, um einen Anwendungsfall richtig zu behandeln, sind diese Informationen Teil dieses Kontexts. Die Idee, dass ein begrenzter Kontext möglicherweise Informationen benötigt, die in einem anderen begrenzten Kontext verfügbar sind, ist daher nicht sinnvoll, da der begrenzte Kontext alle benötigten Informationen enthält.
quelle
Aus meiner Sicht gibt es unterschiedliche Definitionen von "Produkt" - jeder Begrenzungskontext hat seine eigene Definition der "Produkt" -Domäne:
Darüber hinaus würde ich einen zusätzlichen Shop-Bounding-Kontext mit eigener Produktdefinition hinzufügen (eine relevante Kombination der Produktdomänen der anderen Bounding-Kontexte).
Ein Shop-Produkt hätte "Bild und Beschreibungstext" aus Inhalt und Verfügbarkeit aus "Inventar", aber nicht "Produktverkäufer" aus Inventar.
Dieser zusätzliche Shop-Bounding-Kontext hängt vom Inhalt, dem Inventar und dem Preis des Bounding-Kontexts ab
quelle