Dot-Net

域驅動設計:如何訪問聚合根的子節點

  • January 20, 2010

如果我有一個 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";

我想我誤解了整個概念.. :)

  1. 通過簡單的只讀屬性或 get 方法訪問聚合根的子節點並沒有錯。

重要的是要確保與孩子的所有互動都由聚合根進行調解,以便有一個單一的、可預測的地方來保證不變數。

很好Order.LineItems,只要它返回(公共)不可變對象的不可變集合。同樣Order.LineItems[id]。有關範例,請參閱規範 Evans 批准的 ddd 範例的原始碼,其中聚合根Cargo類公開了它的幾個子類,但子實體是不可變的。

  1. 聚合根可以保存對其他聚合根的引用,它們只是不能相互更改。

如果您有“藍皮書”(領域驅動設計),請參閱第 127 頁上的範例,該範例顯示了您可能擁有的方式Car.Engine,其中CarEngine都是聚合根,但引擎不是汽車聚合的一部分,您可以’不要使用任何方法對引擎進行更改Car(反之亦然)。

  1. 在域驅動設計中,您不必使所有類聚合根或聚合的子級。您只需要聚合根來封裝一組有凝聚力的類之間的複雜互動。您提出的Customer類聽起來根本不應該是聚合根 - 只是一個包含引用ContractAddress聚合的正常類。

引用自:https://stackoverflow.com/questions/2104225