2014-09-20 12 views
5

Ich bin etwas verwirrt über die Herkunft von Entitäten in einer Umgebung, die CQRS & Event Sourcing nutzt. Um meine Frage klar zu stellen, nehmen wir das folgende bekannte Beispiel eines Webshops:DDD, CQRS, Event Sourcing: Woher kommen Entitäten?

Sie können eine Bestellung als eine aggregierte Wurzel modellieren. Ein Auftrag akzeptiert Bestellpositionen, die selbst durch ein Produkt und eine Menge definiert sind.

Da eine Bestellzeile eine Entität ist, die während des Bestellvorgangs selbst konstruiert wird, gibt es immer noch die Vorstellung eines Produkts, das ebenfalls eine Entität zu sein scheint. Aber woher kommt das Produkt oder gar der Produktkatalog? Meiner Meinung nach gibt es im beschränkten Kontext einer Order keine solche Sache wie eine Produkt-Aggregatwurzel. Wie würde dann der Bestellkontext über Produkteinheiten bekannt sein? Werden sie in einem anderen beschränkten Kontext gehalten und irgendwie im Lesespeicher des Auftragskontextes materialisiert?

Antwort

3

Im BC, die Order es der Fall, dass Product, als Teil eines OrderLine sein könnte in der Tat enthält, ein Wertobjekt ist, bestehend aus Werten wie ProductId, Name usw.

Der Auftrag Kontext muss nicht über Produkteinheiten wissen, da Auftragszeilen normalerweise nur einfache Werteigenschaften enthalten (Produkt-ID/Artikelnummer, Name, Menge und Preis-pro-Artikel). Daher könnte Order eine Funktion zur Verfügung stellen, wie

void addOrderLine(ProductId productId, String productName, BigDecimal pricePerItem, int quantity). 

Es ist eigentlich nicht relevant für die „Order“ -BC wo diese Werte für productId, productName usw. stammen.

In der Praxis jedoch ist es wahrscheinlich sehr wahrscheinlich, dass diese Werte von einem anderen beschränkten Kontext erhalten werden können, sagt das „Produkt“ -BC, die für die Bestandsführung verantwortlich ist usw.

Es ist durchaus üblich, das zu lassen, UI orchestrieren diese Jackets:

  • die UI (ein Web-Shop für die Kunden, zum Beispiel) lädt die Produkte und deren Preise von der „Produkt-BC“
  • der Benutzer Produkte in einen Warenkorb legt (nehmen wir an, der Einfachheit halber ist dies auch der "Order-BC"). Die UI löst Befehle wie AddToShoppingBasketCommand(productId, productName, quantity, price) aus, die von "Order" -BC verarbeitet werden.
  • Wenn der Benutzer die Bestellung für den aktuellen Einkaufskorb bestellen möchte, wird ein PlaceOrderCommand ausgelöst.
  • Der Befehlshandler für PlaceOrderCommand nimmt den aktuellen Warenkorb und erstellt eine entsprechende Order; Alles, was es braucht, sind für jedes Produkt die jeweiligen Eigenschaften von Produkten, die bereits im Warenkorb aufgeführt waren (und ursprünglich in der AddToShoppingBasketCommand waren). Beachten Sie, dass es nicht über den Begriff einer Entität aus dem Product-BC wissen muss.
+0

Ich sollte hinzufügen, dass der letzte Aufzählungspunkt sollte durch einen Domain-Service getan werden, da Übersetzen von Warenkörben zu Bestellungen ist eindeutig ein Domain-Konzept. –