領域驅動設計之實體、值對象、領域服務


建立領域模型的第一步就是需要識別出實體、值對象與領域服務。

一.實體

1.實體是領域中需要唯一標識的領域概念。通常在業務中,需要唯一標識與區分的對象並需要持續對它進行跟蹤,這樣的對象我們認為是實體。這里的唯一標識通常指的是業務上的唯一標識,比如訂單號、雇員工號等信息,而不是數據庫中因為技術需要存儲的自增int id或Guid列。

2.如果兩個實體所有狀態都一樣,但如果標識不一樣,就是兩個不同實體。比如訂單對象就應該是實體,就算兩個訂單的訂單日期、訂單總額等信息都一樣,只要標識不一樣,比如訂單號,我們就認為它們是不同的實體。

3.實體只保留必要的屬性與行為。比如一個客戶實體應該保留客戶的基本信息,但像國家、省、城市、街道等信息聯合表示一個完整的概念,這種完整的概念應該遷移到其他實體或值對象上,這樣有助於客戶實體的理解和可維護性,並明確了清晰的職責。

 

二.值對象

1.值對象是領域中不需要唯一標識的領域概念,通常在業務中,我們不需要區分對象是哪一個,而只關心對象是什么,這樣的對象我們認為是值對象。

2.如果兩個對象所有狀態都一樣,我們就認為是同一個值對象,比如地址信息、訂單狀態信息等。

3.值對象是只讀的,具有不變性不能直接修改,但可以被替換。如果我們要修改一個客戶的街道信息,應該是Customer.Address address=new Address();address.Street=;而不應該是Customer.Address.Street=;

 

三.領域服務

1.某些業務行為不好歸於某個實體或值對象時,可以把它們歸與領域服務這種對象。

2.領域服務本質上就是一些操作,不包含狀態,通常用於協調多個實體。比如借書領域中,賬戶、書與借書信息分別是三個實體(實際上分別是三個聚合的聚合根,聚合與聚合根后面文章再詳細描述),借書的這個行為歸於其中任何一個實體都不合適,雖然有一種認為是在賬戶實體上實現借書行為,將書作為參數傳遞給賬戶,並在方法中操作借書信息,但因為在賬戶聚合根上要使用到其他兩個聚合根,建議還是通過領域服務進行協調。並且通過領域服務進行協調,還可以保證不同聚合的一致性(比如一個借書信息產生后,相關書的總數信息就減少1,同時賬戶所借書的總數上加1)。

3.領域服務可以直接暴露給應用層,這樣可以有效的保護領域模型。

4.DDD中定義了三種服務:應用層服務、領域服務、基礎服務。

 

歡迎加入QQ討論群:309287205

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM