我有一個由名爲Master的根實體和一個名爲Detail的葉子組成的聚合。所以主實體有一個Detail實體的集合。我不會將Details集合公開給客戶端,因爲我不想讓客戶端直接向其添加詳細信息項。相反,我在我的主實體上有一個AddDetail方法,它在新的Detail項目被添加後立即驗證域不變量,並允許我們在該位置應用我們的域規則。詳細信息作爲只讀IEnumerable屬性公開。 當我想在我的MasterRepository中加載Details項時,問題就出現了。由於沒有項目可以添加到Details集合,我不知道如何加載作爲Master實體狀態一部分的Details。另一方面,我認爲在加載主實體的狀態時使用AddDetail方法並不是一個好習慣,因爲那時規則已經被應用,並且在加載實體的狀態時驗證它們將是一個冗餘重載。另外,添加一個新的細節,觸發一些我不想在加載實體時發生的域事件。在DDD中加載域實體的子集合
0
A
回答
2
我不認爲這是使用AddDetail方法很好的做法,加載主實體的狀態
你是正確的AddDetail
方法是使用不是一個好主意。
我不知道如何加載作爲主實體狀態一部分的細節。
如何加載Master
實體的其他屬性?
有很多可供選擇的我提到的回答另一個問題時(How to retrieve Domain Object from Repositories):
- 奧姆斯可以映射私有字段(如NHibernate的,的EntityFramework)。
- 反射可以用來訪問私人領域。
- 集合可以通過用於構造實體的公共構造函數傳遞。我會避免使用公共設置器進行收集。
- 3-RD部框架可以是有用的,有時(例如AutoMapper)
由於Detail
實體的集合是一個簡單的Master
的屬性我會使用用於加載其它性質的方法。
1
你沒有說你正在使用哪種語言,但是ORM框架通常通過反射來直接訪問主內部字段。
如果您自己推出或使用沒有反射的語言,則可以添加一個內部實用程序類(例如,在同一個包中),該實用程序具有對字段的包/朋友訪問權,並可供存儲庫用於訪問字段直接。
相關問題
- 1. Eager在實體框架中加載多個子集合
- 2. 明確加載實體的集合
- 3. DDD,聚合根和實體
- 4. DDD和實體框架中的聚合
- 5. DDD - 子實體封裝
- 6. 實體框架4.4,重新加載子集合對象
- 7. 加載相應的實體,同時加載集合
- 8. 使用實體框架加載嵌套實體/集合
- 9. 將實體添加到實體集合?
- 10. DDD:將域拆分爲不同程序集中的子域
- 11. 實體框架在一個請求中加載多個集合
- 12. 在實體框架中加載懶惰集合太懶惰
- 13. 實體框架查詢包含實體集合的子實體
- 14. 在DDD中,是否允許具有部分值的實體的集合屬性?
- 15. 訂單在實體框架子集合
- 16. RIA:加載實體集
- 17. 將相關實體加載到不同的查詢和子集合排序中
- 18. 指向根實體的DDD /聚集根/成員實體
- 19. 如何避免加載實體框架中的集合屬性
- 20. 在C#中實現DDD實體類
- 21. 通過實體框架中的屬性加載相關集合(延遲加載)
- 22. 實體框架延遲加載只加載集合中的一個項目
- 23. 我怎麼能在doctrine2加實體的集合,主要實體
- 24. 跨域域(DDD)實體的命名空間
- 25. 實體框架 - 在實體集合上使用Join子句
- 26. DDD和C# - 限制訪問子實體
- 27. NHibernate負載實體與子集合的一部分
- 28. ddd:實體或VO
- 29. 在Groovy服務中加載實體時包含子實體
- 30. 實體框架 - 延遲加載,加載子實體問題
感謝您的回答。我沒有提到該語言,因爲我認爲我的問題是一個通用設計問題,我不想尋找一種語言特定的解決方法。 – Daniel