abp vnext2.0核心元件之DDD元件之實體結構原始碼解析
接著abp vnext2.0核心元件之模組載入元件原始碼解析和abp vnext2.0核心元件之.Net Core預設DI元件切換到AutoFac原始碼解析集合.Net Core3.1,基本環境已經完備,接下去就是構建領域層,vnext整個領域層大致分為聚合根、實體、值物件、事件實體、倉儲、服務等等,內容較多,所以我打算分隨筆進行介紹.首先介紹領域實體。注:這邊所說的實體,是abp團隊提供的抽象.如果不瞭解領域相關的知識,建議閱讀<<領域驅動設計:軟體核心複雜性應對之道>>需要一定設計模式的功底.如果設計模式不瞭解,請移步本人的設計模式分類.我也是略懂,所以本文有不當之處,請指正!謝謝!另外提一點,貧血的領域模型和充血的領域模型有本質的區別.有興趣的可以研究研究,後續有時間我也會補充隨筆,大家一起來探討.
領域實體分為審計實體和一般實體,如下圖所示
圖中紅框為常用實體抽象,Events中的實體需要配和EventBus事件匯流排,這一塊作為vnext的單獨元件,後續我會寫一篇文章解析原始碼.ok,下面開始講解.
整個實體抽象結構和老版abp沒有什麼大的區別.單單從內容看.首先介紹普通實體.分為聚合根和一般實體
1、實體
為什麼要先介紹實體,因為聚合根也是一個實體,實體程式碼如下:
這邊就很有趣了,很明顯支援複合主鍵的實體.貌似和老版Abp不一樣,記不太清了,一般情況下,複合主鍵的設計也比較少見.單主鍵較多.
再看看泛型實體,主鍵可自行指定
很簡單,這邊說下Equals的邏輯,比較複雜,如下:
這兩個邏輯很簡單,看看就明白了.
接下去判斷實體的主鍵
如果主鍵的值為其型別的預設值,且比較的兩個型別都是如此,那麼直接認為兩個實體不相等.
到這裡需要理解下這個邏輯,如果兩個實體不為空,且型別一致,且引用不一樣,但是兩個實體的主鍵都為其型別的預設值.則認為兩個實體不相等.
官方解釋是:Transient objects are not considered as equal
接著
兩個型別必須具有型別的IS-a關係或必須是同一型別
接著
如果兩個實體都是租戶實體,且上面的條件都不滿足的情況下,兩個實體的租戶Id不相等,則認為兩個實體不相等.
ok,實體結構到這裡解析完畢,比較簡單.
2、聚合根
聚合根本身也屬於一個實體,其結構如下
挑幾個核心介面解析下
每一個聚合根都具有一組方法來操作領域事件,因為領域事件作為vnext單獨元件的存在,所以本文不做解析,後續會有隨筆進行介紹.
接著
每一個聚合根都維護了一個額外屬性的欄位,方便進行靈活的擴充套件.比如和mogodb等庫進行合作.
接著
每一個聚合根都維護著一個併發令牌,初始化聚合根時,直接給一個GUID值,貌似只在EF Core中有效.其他ORM可能需要自行實現(個人理解,如果Dapper支援這種機制,請在評論區告知,萬分感謝)。
當然對應的有一個泛型版本,主鍵可自行指定
ok,整個聚合根的結構也介紹完畢,比較簡單.
3、審計實體 - 建立型實體
(1)、建立型實體
只包含建立功能的常規實體抽象.泛型版本主鍵可自行指定 如下:
整個設計我個人有一個疑問,如下:
主鍵不應當統一嗎?歡迎在評論區討論.
(2)、建立型實體帶建立人抽象
如果當前記錄需要記錄建立人,那麼就可以使用這個實體.當然也提供了泛型版本,主鍵可自行指定
4、審計實體 - 建立修改型實體
(1)、建立修改型實體
如果當前實體同時具備建立和修改的功能,那麼可以使用如下實體抽象
這裡的Guid,依然如此,個人覺得主鍵需統一,泛型版本主鍵可自行指定 如下:
(2)、建立修改型實體呆建立者和修改者
如果當前實體同時具備建立和修改的功能,同時需要記錄建立者和修改者,那麼可以使用如下實體抽象
泛型版本,主鍵可自行指定 如下:
5、審計實體 - 建立修改刪除型實體
(1)、建立修改刪除型實體
如果當前記錄具備建立、修改、刪除三大功能,那麼可以使用如下實體抽象
泛型版本 主鍵可自行指定 如下:
(2)、建立修改刪除型實體帶建立者和修改者和刪除者
如果當前實體同時具備建立和修改和刪除的功能,同時需要記錄建立者和修改者和刪除者,那麼可以使用如下實體抽象
泛型版本 主鍵可自行指定 如下:
6、審計聚合根 - 建立型聚合根
如果當前聚合根具備建立的功能,那麼可以使用如下實體抽象
泛型版本 主鍵自行指定如下
因為篇幅問題,聚合根其餘的功能就不介紹了,和實體一致.其實本質聚合根就是一個實體.
ok,vnext關於DDD的實體結構架構大致就是如此,很簡單,當然這邊領域事件結構沒有介紹,後續有隨筆會介紹.可以看到,除了主鍵沒有統一.這個設計非常的nice
7、值物件
關於值物件有如下文章
https://docs.microsoft.com/en-us/dotnet/standard/microservices-architecture/microservice-ddd-cqrs-patterns/implement-value-objects
微軟提供的關於值物件的實現思路,abp團隊也是參照此文章實現,其程式碼如下:
abp團隊也只是提供了簡單的抽象,程式碼也比較簡單,這裡就不多說明了.
純屬個人理解,能力有限,有問題請指