Dot-Net
域驅動設計:如何訪問聚合根的子節點
如果我有一個 Order 類作為聚合根和 1000 個行項目。
如何僅載入 1000 個訂單項之一?據我了解,訂單項只能通過 Order 類訪問,並且具有“本地”身份。我還會像“GetLineItemById”一樣在 OrderRepository 創建一個儲存庫方法嗎?
編輯評論答案: 目前我認為擁有一個不可變的孩子是不合理的。如果我有一個包含多個地址、合同甚至更多子集合的 Customer 類怎麼辦。我想在其上執行 CRUD 方法的巨大實體。
我會
public class Customer { public IEnumerable<Address> Addresses { get; private set; } public IEnumerable<Contracts> Contracts { get; private set; } ... }如果使用者更正地址的街道或合同的財產,我是否必須這樣做?
public class Customer { public void SetStreetOfAddress(Address address, street){} public void SetStreetNumberOfAddress(Address address, streetNumber){} }那麼客戶類將充滿子操作方法。所以我寧願做
addressInstance.Street = "someStreet";我想我誤解了整個概念.. :)
- 通過簡單的只讀屬性或 get 方法訪問聚合根的子節點並沒有錯。
重要的是要確保與孩子的所有互動都由聚合根進行調解,以便有一個單一的、可預測的地方來保證不變數。
很好
Order.LineItems,只要它返回(公共)不可變對象的不可變集合。同樣Order.LineItems[id]。有關範例,請參閱規範 Evans 批准的 ddd 範例的原始碼,其中聚合根Cargo類公開了它的幾個子類,但子實體是不可變的。
- 聚合根可以保存對其他聚合根的引用,它們只是不能相互更改。
如果您有“藍皮書”(領域驅動設計),請參閱第 127 頁上的範例,該範例顯示了您可能擁有的方式
Car.Engine,其中Car和Engine都是聚合根,但引擎不是汽車聚合的一部分,您可以’不要使用任何方法對引擎進行更改Car(反之亦然)。
- 在域驅動設計中,您不必使所有類聚合根或聚合的子級。您只需要聚合根來封裝一組有凝聚力的類之間的複雜互動。您提出的
Customer類聽起來根本不應該是聚合根 - 只是一個包含引用Contract和Address聚合的正常類。