2014-09-20 11 views
5

Jestem nieco zdezorientowany co do pochodzenia podmiotów w środowisku, które korzysta z CQRS & Event Sourcing. Aby moje pytanie było jasne, przyjrzyjmy się dobrze znanemu przykładowi sklepu internetowego:DDD, CQRS, Sourcing wydarzeń: skąd pochodzą podmioty?

Możesz modelować zamówienia jako agregat root. Zamówienie przyjmuje linie zamówienia, które same są zdefiniowane przez produkt i ilość.

Ponieważ linia zamówienia jest jednostką, która jest tworzona podczas samego procesu zamówienia, nadal istnieje pojęcie produktu, który również wydaje się być podmiotem. Ale skąd pochodzi produkt, a nawet katalog produktów? Moim zdaniem nie ma czegoś takiego jak agregat produktu w ograniczonym kontekście zamówienia. W jaki sposób kontekst zamówienia będzie wiedział o jednostkach produktu? Czy są utrzymywane w innym ograniczonym kontekście i jakoś zmaterializowały się w czytanym magazynie kontekstu zlecenia?

Odpowiedz

3

W BC, który zawiera Order to może rzeczywiście być tak, że Product, jako część OrderLine, jest obiektem wartości, składający się z wartościami takimi jak ProductId, Name itp

Kontekst zamówienie nie potrzebują wiedzieć o jednostkach produktu, ponieważ wiersze zamówienia zwykle zawierają jedynie proste właściwości tylko o wartości (identyfikator produktu/SKU, nazwa, ilość i cena/produkt). Dlatego Order mógłby pełnić funkcję takie jak

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

To nie jest rzeczywiście istotne dla „porządek” -bc gdzie te wartości productId, productName etc pochodzą od.

W praktyce jednak, to chyba bardzo prawdopodobne, że te wartości można uzyskać z innego ograniczonego kontekście znaczy „Produkt” -bc, która jest odpowiedzialna za zarządzanie zapasami itp

To dość powszechne, aby pozwolić UI orkiestrować te BCS:

  • UI (sklep internetowy dla klientów, na przykład) ładuje produkty i ich ceny z „product-BC”
  • użytkownik umieszcza produkty w koszu na zakupy (załóżmy dla uproszczenia jest to również "Order-BC"). W przypadku interfejsu użytkownika uruchamiane są komendy, takie jak AddToShoppingBasketCommand(productId, productName, quantity, price), które są obsługiwane przez "Zamówienie" -BC.
  • Gdy użytkownik chce złożyć zamówienie na bieżące zakupy, wygrzewa się, odpala PlaceOrderCommand.
  • Polecenie obsługi dla PlaceOrderCommand pobiera bieżący koszyk na zakupy i konstruuje odpowiadające mu Order; wszystko, czego potrzebuje, to dla każdego produktu odpowiednie właściwości produktów, które były już wymienione w koszyku (i były pierwotnie w wersji AddToShoppingBasketCommand). Zauważ, że nie trzeba wiedzieć o pojęciu jednostki Product z Product-BC.
+0

Należy dodać, że ostatni punkt końcowy powinien być wykonany za pośrednictwem usługi domeny, ponieważ tłumaczenie koszy zakupów na zamówienia jest wyraźnie pojęciem domeny. –

Powiązane problemy