2

假設我們有它存儲在表層次深三個層次在我們的領域這樣的集合體。我們將域對象表示爲Order - OrderItems - ItemAttributes。我們還假設我們在數據層使用了Repository模式。越來越沉重聚集的名單

庫包含方法GetAll返回的Orders上市。

我們遵循REST我們的服務層上,因此,我們使用

  • GET /orders獲得上市
  • GET /orders/{Id}得到具體Order

上市只包含基本字段每個Order沒有細節,但是,通過id查詢返回更大的對象。

作爲一個Order物化是昂貴的操作,我們不喜歡的事實,我們得到充分的聚集只是一對夫婦的字段發送到客戶端。另一方面,我們嘗試遵循合理的規則,即知識庫必須僅返回完全初始化的聚合。

我們怎麼能解決這個難題?

+1

一個字:CQRS http://www.sapiensworks.com/blog/post/2013/05/04/CQRS-Explained.aspx – MikeSW

回答

2

除了CQRS別人的建議,將一個簡單的Lazy loading是一個很好的解決這個問題呢?如果訂單項未被訪問,它們將不會被加載。或者如果您不能使用延遲加載,則需要專門的OrderSummary/OrderStatus域對象?

此外,它始終是值得重新考慮是否真的需要一個重集。可能根本沒有要求它的域規則。例如生命週期是一個衆所周知的「錯誤的原因」,因爲有大量的聚合(像Group-> User或Product-> BacklogItem)。強烈建議閱讀此主題:Aggregate design

+0

延遲加載的問題是我已經使用Order-OrderItems進行了簡化: - )在這個聚合中實際上有很多事件驅動的邏輯,它檢查整個層次結構。感謝您的鏈接,我一定會嘗試閱讀您的建議。 – starteleport