一、什么是DDD?
DDD又叫領域驅動設計,它是一種軟件開發的思想,不是具體的技術或者框架,它的核心是維護一個能夠反映領域概念的模型,通過一些模式和約束來指導團隊進行統一的設計開發。
二、為什么要使用DDD?
- 從技術層面進行分層,每層都在關注自己的事情,比如領域層關注業務邏輯,倉儲層關注持久化數據,應用服務層關注協調領域層和倉儲層實現某一個業務,接口層關注暴露應用服務接口給外界調用
- 從業務維度,將大的系統划分為多個領域界限,可以選擇將不同的界限分配給不同的團隊、不同的界限使用不同的倉儲,實現界限內是高內聚而界限之間是低耦合的
由於DDD只是一種開發理念,所以要想在項目中發揮他的作用,我們需要先搞懂它里面的一些基本概念和核心組件,然后基於它搭建一個輕量級的框架。
三、DDD的核心組件
1.領域界限:
對於一個系統而言,我們對其按照不同的領域划分不同的界限,不同的領域界限之間可以是相互獨立的。每個領域內都有自己獨立的領域邏輯、數據持久化和接口等。
2.聚合的概念:
通常我們會將多個實體和值對象進行組合來表達一個完整的概念,比如訂單實體、訂單詳情實體、訂單收貨信息組成了一個完整的訂單概念,他們的生命周期是一樣的,在進行持久化時也應該進行統一持久化。
3.聚合根的概念:
對於一個聚合而言,必須有一個對象能夠表達這個聚合的總概念,外界想要對這個聚合進行持久化的操作時,必須通過這個總概念進行協調,通過它來保證業務一致性,那么這個對象我們就稱之為聚合根。
在一個聚合中有且只有一個聚合根,想要訪問聚合內的對象,必須要通過聚合根才能進行訪問(當然,其他的實體可以在外界需要查詢時臨時調用),聚合根擁有唯一的標識,也擁有業務生命周期,其本質也是實體。比如訂單聚合中的訂單實體即為這個聚合的聚合根。
4.實體的概念:
實體是一個有業務生命周期的概念,擁有唯一標識用於標識和區分。比如一個訂單對象就是一個實體。
5.值對象的概念:
值對象是一個無業務生命周期的概念,通常用於定義聚合中的某一個復雜的對象屬性,不需要定義標識進行區分。比如一個訂單中的收貨信息。
6.倉儲的概念:
倉儲用於對聚合進行持久化,通常情況下我們為聚合內的聚合根配備一個倉儲即可 。
有了上面這些核心概念之后,下面我們看看搭建一個DDD的架構需要做什么
四、經典DDD架構:
1.基礎結構層
定義DDD框架的底層基本概念,需要實現:聚合根接口定義(IAggregationRoot)、實體接口定義(IEntity)、值對象接口定義(IValueObject)、基本倉儲接口定義(IRepository<T>)和倉儲接口的持久化實現(EFCoreRepository<T>)
定義頂層的聚合根倉儲具體實現,繼承自基本倉儲接口實現和聚合根的倉儲接口,實現基本倉儲接口內的用於公共倉儲使用的方法
2.領域層:界限上下文的領域邏輯
需要定義界限上下文的領域對象的POCO模型,在模型中也可以定義自己的業務邏輯,業務邏輯不要與倉儲發生直接接觸
定義領域內聚合根的倉儲接口,該接口繼承自基礎結構層的基本倉儲接口,聚合根的倉儲接口可定義自己的業務接口
定義領域內的倉儲接口的實現,繼承自基本倉儲接口及頂層倉儲實現
3.應用服務層:領域對外公布接口的業務實現。
通過調用領域對象的領域邏輯,完成領域的邏輯業務。
通過調用聚合根的倉儲接口完成對領域對象的預持久化(此時的數據保存在數據庫上下文中)
通過調用基礎倉儲接口層的工作單元方式進行數據的提交完成真正的持久化(此時在上下文中做更改的數據將被一起保存到數據庫)
比如用戶下訂單之后,系統需要創建訂單、扣減庫存、增加用戶積分等等,在訂單的應用服務內需要調用訂單領域內的領域對象邏輯和倉儲並協調庫存倉儲和用戶倉儲一起完成
4.接口層:非常薄的一層
定義外界訪問的接口,調用應用服務層的實現完成某一業務動作
對於DDD相關的理論知識就介紹到這里,在下一篇我將結合實例來和大家進行進一步的學習