2014-09-20 68 views
5

我對使用CQRS & Event Sourcing的環境中的實體起源有點困惑。爲了清楚我的問題,讓我們網店以下衆所周知的例子:DDD,CQRS,事件採購:實體從哪裏來?

您可以模擬一個順序的總根源。訂單接受訂單行,它們本身是由產品和數量定義的。

由於一個訂單是設置在順序進程本身仍有這似乎是一個實體,以及一個產品的概念中構建的實體。但是產品甚至產品目錄是從哪裏來的?在我看來,在訂單的有限上下文中沒有像產品聚合根那樣的東西。訂單上下文如何知道產品實體?它們是否維護在另一個有界的環境中,並以某種方式在訂單環境的讀取存儲中實現?

回答

3

在包含Order它可能確實是Product,作爲OrderLine的一部分,是一個值對象,由值,如ProductIdName

順序上下文沒有需要的情況下的BC瞭解產品實體,因爲訂單行通常只包含簡單的僅限於價值的屬性(productId/SKU,名稱,數量和每個物品的價格)。因此,Order可以提供的功能,如

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

它實際上是不相關的「訂單」 -BC其中對於productIdproductName等這些值從起源。

然而在實踐中,它可能是非常有可能的是,這些值可以從另一個界上下文來獲得,說「產品」 -BC,負責庫存管理等

是很常見的,讓UI協調這些BKS:

  • 的UI(爲客戶提供網上商店,例如)加載產品,其價格從「以產品爲BC」
  • 的用戶將產品放入購物籃(我們假設爲簡單起見,這也是「Order-BC」)。因爲,UI會觸發由「Order」-BC處理的命令,如AddToShoppingBasketCommand(productId, productName, quantity, price)
  • 當用戶想放置順序曬當前購物,它觸發一個PlaceOrderCommand
  • PlaceOrderCommand的命令處理程序來處理當前購物籃,並構造相應的Order;所有需要的是,對於每種產品,已經列在購物籃中的產品的各個屬性(最初在AddToShoppingBasketCommand中)。請注意,它不需要知道產品BC中的Product實體的概念。
+0

我應該補充一點,最後一點要通過域服務完成,因爲將購物籃翻譯成訂單顯然是一個領域概念。 – 2014-09-23 13:42:28