回答
在DDD的上下文中,持有引用意味着某種數據庫引用。這並不意味着一旦你從數據庫加載你的聚集,沒有任何東西可以獲得對其任何成員的運行時引用。這個想法是,與聚合成員的所有交互都通過聚合,從而履行其作爲一致性和完整性邊界的角色。但是,爲了顯示和查詢目的,我更喜歡read-model pattern,其中查詢特定類用於表示查詢數據,並且不同於用於表示聚合的類。這允許聚合集中在其行爲上,而不用關心它可能是什麼查詢。如果使用CQRS + Event Sourcing,那麼你聚合沒有公共數據成員,只有行爲方法。在這種情況下,查詢將根據聚合生成的事件實施爲預測。
謝謝eulerfx。雖然你指的是一個很好的解決方案,但我認爲它不僅僅是避免數據庫引用,而且也是運行時引用。正如你所說的,這個想法是,所有與聚合成員的交互都通過聚合,從而實現其作爲一致性和完整性邊界的角色。如果我提供了一個內部實體的參考,並且有公共制定者,那麼我會打破這個模型。 – Pleonc 2012-07-27 18:00:05
是的,這是真的,你在這方面的嚴格程度可能會有所不同。例如,如果您使用的是諸如NHibernate之類的ORM,它需要公共成員進行映射,因此您別無選擇,只能將該選項留給外部引用。 – eulerfx 2012-07-27 19:46:32
數據庫引用或詳細信息(如ORM)在域中沒有位置。這就是爲什麼你開始對IGNORING數據庫進行建模的原因,這樣你就不會試圖建立一切以db爲中心的東西。 CQRS是這個問題最明顯,最簡單和可維護的解決方案。 – MikeSW 2012-07-28 08:36:01
我允許客戶端持有對值對象的引用。我沒有恐懼地返回VO的。我也將VO傳遞給Aggregate Root上的公共方法。值對象是不可改變的,因此不存在違反聚合的一致性邊界的外部狀態改變的危險。
- 1. 域驅動設計和聚合引用
- 2. 域驅動設計聚合
- 3. 域驅動設計聚合根設計
- 4. 域驅動設計和聚合
- 5. 域驅動設計:服務和聚合中的域規則
- 6. 域驅動設計:具有大集合的聚合根
- 7. 使用域驅動設計與實體框架聚合根
- 8. 域驅動設計中的聚合關係
- 9. 建模域驅動設計中聚合的不同視角
- 10. 域驅動設計中的聚合根複雜度
- 11. 域驅動設計:每個聚合根的存儲庫?
- 12. 作爲聚合根的域驅動設計查找表
- 13. 域驅動設計的聚合模式和休眠@OneToMany單向
- 14. 域驅動設計中的存儲庫和聚合根
- 15. 領域驅動設計:聚合根和附屬總根
- 16. 域驅動設計:何時創建聚合根?
- 17. 在域驅動設計中獲取關聯聚合
- 18. 域驅動設計:聚合根可以有公共setter嗎?
- 19. 域驅動設計相關聚合根和UI檢索
- 20. 域驅動設計
- 21. 如何設計自參考聚集在域驅動設計
- 22. 濫用域驅動設計
- 23. 如何將領域驅動設計引入協程序員?
- 24. 定義成員資格提供和領域驅動,設計
- 25. 領域驅動設計能值對象引用/嵌入實體
- 26. 一系列簡單的聚合根的問題(領域驅動設計)
- 27. 實施域驅動設計
- 28. 域驅動設計服務
- 29. 域驅動設計isDirty,isNew
- 30. 域驅動設計問題
DDD的原則傾向於在CQRS也處於有序狀態的協作域中最爲有效。因此,用於更新的相同域模型的報告會非常混亂。 – 2012-07-27 14:17:17