DDD學習

https://www.cnblogs.com/fan-yuan/archive/2004/01/13/3513873.html

 

1 聚合根,實體,值對象的區別

從標識的角度

聚合根具有全局的唯一標識,而實體只有在聚合內部有唯一的本地標識,值對象沒有唯一標識

從是否只讀的角度

聚合根出來唯一標識,其他信息可變,實體是可變的,值對象是隻讀的

從生命週期的角度

聚合跟有獨立的生命週期,實體的生命週期從屬於其所屬的聚合,實體完全由其所屬的聚合根,值對象沒有生命週期概念,只是一個值

2 聚合根,實體,值對象之間如何建立關聯

聚合根到聚合根:通過ID關聯

聚合根到其內部的實體,直接對象引用

聚合根到值對象,直接對象引用

實體對其他對象的引用規則

1)能引用其所屬聚合內的聚合根,實體,值對象

2)能引用外部聚合根,但推薦以ID方式關聯,另外也可以關聯某個外部聚合內的實體,但必須是ID關聯

值對象對其他對象的引用規則:只需確保值對象是隻讀的即可

3.如何識別聚合與聚合根

Bounded  Context(界定的上下文) 可能包含多個聚合,每個聚合都有一個聚合根

例子分析1:訂單模型

Order(一 個訂單)必須有對應的客戶信息,否則就不能稱爲一個有效的Order;同理,Order對OrderLineItem有不變性約束,Order也必須至少有一個OrderLineItem(一條訂單明細),否 則就不能稱爲一個有效的Order;另外,Order中的任何OrderLineItem的數量都不能爲0,否則認爲該OrderLineItem是無效 的,同時可以推理出Order也可能是無效的。因爲如果允許一個OrderLineItem的數量爲0的話,就意味着可能會出現所有 OrderLineItem的數量都爲0,這就導致整個Order的總價爲0,這是沒有任何意義的,是不允許的,從而導致Order無效;所以,必須要求 Order中所有的OrderLineItem的數量都不能爲0;那麼現在可以確定的是Order必須包含一些OrderLineItem,那麼應該是通 過引用的方式還是ID關聯的方式來表達這種包含關係呢?這就需要引出另外一個問題,那就是先要分析出是OrderLineItem是否是一個獨立的聚合 根。回答了這個問題,那麼根據上面的規則就知道應該用對象引用還是用ID關聯了。那麼OrderLineItem是否是一個獨立的聚合根呢?因爲聚合根意 味着是某個聚合的根,而聚合有代表着某個上下文邊界,而一個上下文邊界又代表着某個獨立的業務場景,這個業務場景操作的唯一對象總是該上下文邊界內的聚合 根。想到這裏,我們就可以想想,有沒有什麼場景是會繞開訂單直接對某個訂單明細進行操作的。也就是在這種情況下,我們 是以OrderLineItem爲主體,完全是在面向OrderLineItem在做業務操作。有這種業務場景嗎?沒有,我們對 OrderLineItem的所有的操作都是以Order爲出發點,我們總是會面向整個Order在做業務操作,比如向Order中增加明細,修改 Order的某個明細對應的商品的購買數量,從Order中移除某個明細,等等類似操作,我們從來不會從OrderlineItem爲出發點去執行一些業 務操作;另外,從生命週期的角度去理解,那麼OrderLineItem離開Order沒有任何存在的意義,也就是說OrderLineItem的生命周 期是從屬於Order的。所以,我們可以很確信的回答,OrderLineItem是一個實體

 

例子分析2:帖子與回覆的模型,做個對比,以便更好地理解。

 變性分析:帖子和回覆之間有不變性規則嗎?似乎我們只知道一點是肯定的,那就是帖子和回覆之間的關係,1:N的關係;除了這個之外,我們看不到任何其他的 不變性規則。那麼這個1:N的對象關係是一種不變性規則嗎?不是!首先,一個帖子可以沒有任何回覆,帖子也不對它的回覆有任何規則約束,它甚至都不知道自 己有多少個回覆;再次,發表了一個回覆和帖子也沒有任何關係;其次,發表回覆對帖子沒有任何改變;從業務場景的角度去分析,我們有發表帖子的場景,有發表 回覆的場景。當在發表回覆的時候,是以回覆爲主體的,帖子只是這個回覆裏所包含的必要信息,用於說明這個回覆是對哪個帖子的回覆。這些都說明帖子和回覆之 間找不出任何不變性約束的規則;因爲帖子和回覆都有各自獨立的業務場景的需要,所以可以很容易理解它們都是獨立的聚合根;那也很容易知道該如何建立他們之 間的關聯了,但是我們要儘量減少關聯,所以只保留回覆對帖子的關聯即可;帖子沒有任何必要去保存一個回覆的ID的列表;那麼你可能會說,當我刪除一個帖子 後,回覆應該是沒有存在的意義的呀?不對,不是沒有存在的意義,而是刪除了帖子後導致了回覆對帖子的關聯信息的缺失,導致數據不一致。這是因爲帖子和回覆 之間有一種必然的聯繫(1:N),回覆一定會有一個對應的帖子;但是回覆有其自己的生命週期,不應該隨着帖子的刪除而級聯刪除。這種情況下,如果你刪除了 帖子,就導致回覆也成爲了一條無效的數據;所以,我們絕對不允許刪除任何聚合根,因爲一旦你刪除了聚合根,那就意味着與該聚合根相關的其他任何聚合根都會 有外鍵引用缺失的問題,會導致整個領域模型數據的不一致;所以,永遠都不要刪除聚合根;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章