日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

abp vnext2.0核心组件之DDD组件之实体结构源码解析

發布時間:2023/12/4 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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團隊也只是提供了簡單的抽象,代碼也比較簡單,這里就不多說明了.

總結

以上是生活随笔為你收集整理的abp vnext2.0核心组件之DDD组件之实体结构源码解析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。