0

我有一個由名爲Master的根實體和一個名爲Detail的葉子組成的聚合。所以主實體有一個Detail實體的集合。我不會將Details集合公開給客戶端,因爲我不想讓客戶端直接向其添加詳細信息項。相反,我在我的主實體上有一個AddDetail方法,它在新的Detail項目被添加後立即驗證域不變量,並允許我們在該位置應用我們的域規則。詳細信息作爲只讀IEnumerable屬性公開。 當我想在我的MasterRepository中加載Details項時,問題就出現了。由於沒有項目可以添加到Details集合,我不知道如何加載作爲Master實體狀態一部分的Details。另一方面,我認爲在加載主實體的狀態時使用AddDetail方法並不是一個好習慣,因爲那時規則已經被應用,並且在加載實體的狀態時驗證它們將是一個冗餘重載。另外,添加一個新的細節,觸發一些我不想在加載實體時發生的域事件。在DDD中加載域實體的子集合

回答

2

我不認爲這是使用AddDetail方法很好的做法,加載主實體的狀態

你是正確的AddDetail方法是使用不是一個好主意。

我不知道如何加載作爲主實體狀態一部分的細節。

如何加載Master實體的其他屬性?

有很多可供選擇的我提到的回答另一個問題時(How to retrieve Domain Object from Repositories):

  1. 奧姆斯可以映射私有字段(如NHibernate的,的EntityFramework)。
  2. 反射可以用來訪問私人領域。
  3. 集合可以通過用於構造實體的公共構造函數傳遞。我會避免使用公共設置器進行收集。
  4. 3-RD部框架可以是有用的,有時(例如AutoMapper)

由於Detail實體的集合是一個簡單的Master的屬性我會使用用於加載其它性質的方法。

1

你沒有說你正在使用哪種語言,但是ORM框架通常通過反射來直接訪問主內部字段。

如果您自己推出或使用沒有反射的語言,則可以添加一個內部實用程序類(例如,在同一個包中),該實用程序具有對字段的包/朋友訪問權,並可供存儲庫用於訪問字段直接。

+0

感謝您的回答。我沒有提到該語言,因爲我認爲我的問題是一個通用設計問題,我不想尋找一種語言特定的解決方法。 – Daniel