對實體與值對象等進行關聯設計后,就應該進行聚合的划分以及聚合根的確定。
首先我們需要明確為什么需要進行聚合的划分?
原來我們的系統對領域划分的最小單位通常是模塊,比如客戶信息管理模塊、雇員信息管理模塊。但模塊的划分對於設計來說,還是顯得粒度太粗。
一.聚合與聚合根
1.定義了對象之間清晰的關系和邊界,並實現領域模型的內聚。我的理解是:一個聚合內的對象才具有強關聯,對象的關聯設計應該是針對一個聚合中的實體與實體或實體與值對象之間。(比如一個下訂單的領域中,訂單(實體)、訂單項(實體)以及訂單狀態(值對象)應該為一個聚合,訂單與訂單項有關聯、訂單與訂單狀態有關聯)。
2.必須將聚合作為一個修改數據的單元。
3.一個聚合必須有一個聚合根,根是聚合中的一個實體,通常聚合中其他實體需要依賴於聚合根,其他實體不能沒有聚合根而單獨存在,從業務的角度來看它是沒有單獨存在的意義的。比如在第1點中,訂單應該是聚合根,因為訂單項與訂單狀態兩個對象在沒有訂單的情況下是沒有意義的。
4.對一個聚合中實體的訪問或操作,必須通過這個聚合的聚合根開始,主要的目的是這樣可以保證不變的一致性規則。比如在第1點中,訂單有一個訂單總額屬性,訂單項有一個當前項金額的屬性,有一個規則是訂單總額為訂單項總額之和,如果其他聚合繞過訂單聚合根而直接操作訂單項實體,則操作后,很難保證不變的一致性規則,如果通過訂單聚合根操作訂單項,而訂單聚合根負責業務規則的一致性,這樣就能夠保證了。所以聚合根的一個重要職責是負責維護本聚合內部的一致性。
5.在對聚合進行查詢或操作時,整個聚合是作為一個整體,不能直接查詢聚合內部某個非根的對象。
二.識別聚合
識別聚合經過理論和實際的項目開發,我認為應該從以下幾個方面進行聚合划分
1.哪些實體或值對象在一起才能夠有效的表達一個領域概念。
2.對象之間是否必須保持一些固定的規則。
3.聚合不要設計太大,否則會有性能問題以及業務規則一致性的問題。
4.聚合中的實體和值對象應該具有相同的生命周期,並應該屬於一個業務場景。
三.識別聚合根
1.一個聚合只有一個聚合根,聚合根是可以獨立存在的,聚合中其他實體或值對象依賴與聚合根。
2.只有聚合根才能被外部訪問到,聚合根維護聚合的內部一致性。
歡迎加入QQ討論群:309287205