2014-09-20 13 views
5

Sono un po 'confuso sull'origine delle entità in un ambiente che sfrutta CQRS & Event Sourcing. Per chiarire la mia domanda, prendiamo il seguente esempio ben noto di un negozio web:DDD, CQRS, Sourcing di eventi: da dove vengono le entità?

È possibile modellare un ordine come radice aggregata. Un ordine accetta righe d'ordine che sono definite da un prodotto e da una quantità.

Poiché una riga di ordine è un'entità costruita durante il processo dell'ordine stesso, esiste ancora la nozione di un prodotto che sembra essere un'entità. Ma da dove viene il prodotto o anche il catalogo dei prodotti? Secondo me non esiste una cosa come una radice aggregata di prodotto nel contesto limitato di un ordine. In che modo il contesto dell'ordine può conoscere le entità prodotto? Sono mantenuti in un altro contesto limitato e in qualche modo materializzati nell'archivio di lettura del contesto dell'ordine?

risposta

3

Nel aC che contiene Order potrebbe infatti essere il caso che Product, come parte di un OrderLine, è un oggetto valore, costituito da valori quali ProductId, Name ecc

Il contesto ordine non ha bisogno per conoscere le entità di prodotto, poiché le righe di ordine di solito contengono solo proprietà di solo valore (productId/SKU, un nome, quantità e prezzo per/articolo). Pertanto, Order potrebbe fornire una funzione come

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

In realtà non è rilevante per l ' "Ordine" -BC dove questi valori per productId, productName ecc provengono da.

In pratica, tuttavia, è probabilmente molto probabile che questi valori possono essere ottenuti da un altro contesto limitato, dice il "Prodotto" -BC, che è responsabile per la gestione delle scorte, ecc

E 'abbastanza comune per consentire al UI orchestrare queste breve Appartenenza:

  • l'interfaccia utente (un negozio virtuale per i clienti, per esempio) carica i prodotti ei loro prezzi dal "prodotto-BC"
  • l'utente pone prodotti in un paniere (supponiamo per semplicità che questo è anche il "Ordine-BC"). Perché, l'interfaccia utente attiva comandi come AddToShoppingBasketCommand(productId, productName, quantity, price) che vengono gestiti da "Order" -BC.
  • Quando l'utente desidera effettuare l'ordine per lo shopping corrente basked, genera uno PlaceOrderCommand.
  • Il gestore comandi per PlaceOrderCommand prende il carrello della spesa corrente e crea un corrispondente Order; tutto ciò di cui ha bisogno sono, per ciascun prodotto, le rispettive proprietà dei prodotti che erano già elencati nel carrello (originariamente nello AddToShoppingBasketCommand). Si noti che non è necessario conoscere la nozione di entità Product dal prodotto-BC.
+0

Devo aggiungere che l'ultimo punto elenco deve essere eseguito tramite un servizio di dominio, poiché tradurre i cestini degli acquisti in ordini è chiaramente un concetto di dominio. –

Problemi correlati