2013-08-27 61 views
0

我試圖掌握越來越多的域驅動設計並遵循最佳實踐。到目前爲止,這是我的理解:域驅動設計相關聚合根和UI檢索

  • 聚合是相互關聯的實體的集合。
  • 聚合的根源是將聚合的關係綁定在一起的實體。
  • 如果根被刪除聚集的範圍內的所有內容必須刪除以及
  • 總根只能通過身份

我的問題相互引用是:

如果我有更多的而不是一個相互關聯的聚合,比如訂單和產品類別。

應用程序服務應該如何處理訂單和相關產品類別的檢索?

服務是否應該引用訂單和產品類別的每個存儲庫,首先檢索訂單,然後檢索產品類別,最後填寫引用這兩個信息的數據傳輸對象?

事情是這樣的:

public OrderDto GetOrder(int id) 
{ 
    var order = _orderRepo.GetById(id); 

    var productCategory = _categoryRepo.GetById(order.ProductCategoryId); 

    return new OrderDto 
        { 
        CustomerName = order.CustomerName, 
        ProductCategoryName = productCategory.Name, 
        *..etc..* 
        }; 
} 

或者是超必殺保持這一脫鉤,如果他們是緊密相關的根源是什麼?

或者UI應該對獨立服務進行調用以獲取完整圖片嗎?

回答

1

有些情況下,你可能必須根據打破規則Reasons to break the rules section

他們的第一個是presetation方便,這不是什麼大不了的事,當你只是neeed在一次顯示一個訂單,但您提到的解決方案會導致N + 1查詢問題,如果您需要列出順序。

另一種解決方案是堅持規則,並使用持久對象來呈現UI(在列表Order case中)如果要從持久性基礎架構中分離(或已經分離)域模型,可以找到一些討論here

+0

非常感謝...我認爲他在「違反規則的原因部分」中提出了非常好的觀點。我個人認爲,只有在對規則有完整的理解之後,規則纔會被打破。我仍然在學習:) – Chris

+0

我認爲這個規則的目的是防止在一個事務中自然地修改兩個Aggregate,實際上,如果你的團隊使用Aggregate reference但是遵循不修改團隊中的多個Aggregate的規則學科。 – Hippoom