2015-09-05 58 views
0

Evans寫道,聚合的概念是這樣的,聚合的所有對象不是根不能被任何其他對象所引用,而不是它的聚合根。 是否有任何合理的方法來在Java或C#中執行此操作。也就是說,如果我在代碼庫中引入了一個Aggregate,我能否確保在將來沒有對DDD感興趣的開發人員會直接從彙總外部創建一個子部分的引用?或者至少讓他/她難以做到這一點?如何在java或c#中強制執行ddd聚合?

回答

2

我想不出任何不會過分限制您實體的可用性或增加複雜性的方法,這些方式將超過其好處。您應該記住,對非根實體進行臨時(臨時)引用是合法的,並且在某些情況下可能很有用,因此基於靜態​​的基於範圍的限制並不是真正的選擇。

當涉及到高層次的設計原則時,我傾向於依賴於團隊文化和開發者指南而不是防禦性編程,因爲後者通常會以某種方式反彈,最終會出現醜陋的過度複雜的代碼以允許異常到你自己設定的嚴格障礙。 「架構」框架屬於同一類別 - 對於簡單的應用程序來說很簡單且高效,但是當您開始添加異常情況時,它們很快就成爲一種負擔而不是幫助。

+0

謝謝。聽起來很合理。 –

0

爲確保您的聚合內容無法從外部訪問,您必須僅通過其根目錄撰寫(添加內容)。您必須存儲從外部提供的內容的深層副本,以避免存儲已引用的對象。換句話說,您只能存儲由根本身創建的對象。這同樣適用於將聚合內容返回到外部世界 - 根必須只返回存儲對象的深層副本,從而保護它們不被引用。

由於我們談論引用,因此也可以複製不可變對象,從而控制它們何時符合垃圾收集(Java)的條件。

希望這會有所幫助。

+0

如果我錯了,請糾正我,但這不是我對ddd Aggregates的理解。我認爲這個想法是聚合的一個子部分只能通過根來引用。當外部對象以這種方式訪問​​它時,它應該是暫時的。深度複製不是一個解決方案,因爲不分散地拷貝實體並不是一個好主意。我也不認爲對象副本是一個解決方案,因爲重點是概念對象,而不是對象實例,即實體的實例副本仍然是同一個概念對象,因爲它的ID也會被複制。 –