基于ABP實現DDD

??什么是DDD呢?領域驅動設計[DDD]是一種針對復雜需求的軟件開發方法。將軟件實現與不斷發展的模型聯系起來,專注于核心領域邏輯,而不是基礎設施細節。DDD適用于復雜領域和大規模應用,而不是簡單的CRUD應用。它有助于建立一個靈活、模塊化和可維護的代碼庫。


1.《Implementing Domain Driven Design》電子書: https://url39.ctfile.com/f/2501739-610635606-674948?p=2096(訪問密碼:2096)
2.《基于ABP Framework實現領域驅動設計》電子書: https://url39.ctfile.com/f/2501739-610635608-94e753?p=2096(訪問密碼:2096)
3.《Mastering ABP Framework》電子書: https://url39.ctfile.com/f/2501739-610635610-9a8f66?p=2096(訪問密碼:2096)


一.DDD中的領域層和應用層相關概念

DDD主要關注領域層和應用層。

1.DDD中的領域層

領域層中的基本概念有:
(1)實體[Entity]
實體就像面向對象中的對象,它包含屬性和方法,并且有唯一的ID。

(2)值對象[Value Object]
值對象是領域中類型的領域對象。這聽起來很抽象,舉個例子就明白了。比如,訂單Order這個聚合根由一系列的屬性構成:唯一標識ID、OrderDate、OrderItems、Address等。其中Address就是一個值對象。值對象=值+對象=將一個值用對象的方式進行表述,來表達一個具體的固定不變的概念。

(3)聚合[Aggregate]和聚合根[Aggregate Root]
fd17ee6d0921e3a0051e9b868166663d.png?個聚合是一系列對象[實體和值對象]的集合,通過聚合根將所有關聯對象綁定在?起。比如,Issue聚合是由Issue[聚合根]、Comment[實體]和IssuelLabel[值對象]組成的集合。

(4)倉儲[Repository]
倉儲接口定義在領域層,實現在基礎設施層。為什么需要倉儲呢?主要就是解耦數據庫,把增刪查改等數據庫操作和不同類型的數據庫解耦。DDD通用原則之一就是數據庫獨立性原則,領域層和應用層只依賴于倉儲接口,并且倉儲接口不適合使用用任何ORM特殊對象。

(5)領域服務[Domain Service]
領域服務封裝了核心的業務邏輯,它對同一個實體的一個或多個方法進行組合和封裝,或對多個不同實體的操作進行組合或編排,對外暴露成領域服務。

(6)規約[Specification]
規約是?個命名的、可重?的、可組合的和可測試的類,?于根據業務規則過濾領域對象。

(7)領域事件[Domain Event]
通過消息隊列的方式,比如RabbitMQ等,實現一個特定的領域事件發生時,會通知其它的服務。

2.DDD中的應用層

應用層中的基本概念有:
(1)應用服務[Application Service]
通常應用服務層的輸入和輸出都是DTO,并且一個應用服務通常被認為是一個事務。

(2)數據傳輸對象[DTO]
目的主要是解耦應用服務層和展示層。如果沒有DTO,那么應用服務層返回的是完整的對象,包含了展示層并不需要的字段,并且也可能泄露了對象字段信息。

(3)工作單元[Unit Of Work]
簡單理解就是要么全部成功,要么全部失敗。

二.基于ABP模板創建的解決方案結構

基于ABP模板創建的解決方案結構如下所示:d0e824a676f997ab2bc55a06e3d14816.png1.領域層
(1)IssueTracking.Domain[領域層]:該項?包含實體、值對象、領域服務、規約、倉儲接?等。(2)IssueTracking.Domain.Shared[領域共享層]:通常定義的常量和枚舉,都放在該項?中。

2.應用層
(1)IssueTracking.Application.Contracts[應用契約層]:包含應用服務接口和數據傳輸對象。該項?被應?程序客戶端引用,比如Web項目、API客戶端項目。(2)IssueTracking.Application[應用層]:實現在Contracts項目中定義的接?。

3.展示層
(1)IssueTracking.Web[展示層]:這個是前后端不分離的項目命名方式,那么通常是一個ASP.NET Core MVC/Razor Pages應用。

說明:如果是前后端分離的項目,在解決方案中不會包含該項目,而是通過IssueTracking.HttpApi.Host項目提供HTTP API服務,供客戶端調用。

4.遠程服務層
(1)IssueTracking.HttpApi[遠程服務層]:簡單理解就是很薄的控制層,該項目主要用于定義HTTP API,即應用服務層的包裝器,將它們公開給遠程客戶端調用。
(2)IssueTracking.HttpApi.Client[遠程服務代理層]:當第三方客戶端引用該項目時,就可以直接通過依賴注入使用遠程服務應用,通過基于ABP的動態C#客戶端API代理系統來實現的。

5.基礎層
(1)IssueTracking.EntityFrameworkCore:EF Core核心基礎依賴項目,包含數據上下文、數據庫映射、EF Core倉儲實現等。
(2)IssueTracking.EntityFrameworkCore.DbMigrations:用于管理Code First數據遷移的特殊的工具項目。最新ABP中已經移除了該項目,不用了解了。

6.其它層
(1)IssueTracking.DbMigrator:控制臺應用程序,主要是遷移數據庫結構并初始化種子數據。

三.解決方案中項目依賴關系

該解決方案中項目之間的依賴關系如下:f225b92d3664db14742f44d16c2b4906.png1.Domain.Shared
所有項目直接或間接依賴此項目,此項目中的所有類型都可以被其它項目所引用

2.Domain
僅依賴Domain.Shared項目。

3.Application.Contracts
依賴Domain.Shared項目,可以在DTO中復用Domain.Shared中的類型。

4.Application
依賴Application.Contracts項目,因為此項目需要實現應用服務的接口及接口使用的DTO。另外也依賴Domain項目,因為在應用服務中使用倉儲接口或領域對象。

5.EntityFrameworkCore
依賴Domain項目,因為此項目需要將領域對象[實體或值對象]映射到數據庫的表,另外還需要實現Domain項目中的倉儲接口。

6.HttpApi
依賴Application.Contracts項目,因為Controllers需要注入應用服務接口。

7.HttpApi.Client
依賴Application.Contracts項目,因為此項目需要使用應用服務接口。

8.Web
依賴HttpApi項目,發布定義的HTTP API。另外也間接依賴Application.Contracts項目,可以在頁面/組件中使用應用服務。

看上面解決方案依賴關系圖的虛線部分,就會發現Web項目依賴于Application和EntityFrameworkCore項目。這是因為Web是一個可部署的項目,在應用時需要應用服務和倉儲的實現。這樣框架設計的一個弊端就是在展示層中是可以使用實體和EF Core對象的,但這是嚴格避免的。

四.DDD應用程序執行流程

ca34dfbdd19268d728ed5bd31b84ee6e.png第1步:無論是瀏覽器中的Web Application,還是遠程客戶端,它們發起HTTP請求到服務器。

第2步:MVC UI或者HTTP API接收并處理請求,在這個階段執行AOP邏輯,比如授權、輸入驗證、異常處理、審計日志、緩存等。MVC Controller在構造函數中注入應用服務接口,調用方法發送和接收DTO對象。

第3步:應用服務使用領域層的對象[實體、倉儲接口、領域服務等]來實現用例,在這個階段同樣執行一些AOP邏輯,比如授權、驗證、審計日志和工作單元等。一個應用服務方法是一個工作單元,具有原子性。

參考文獻:
[1]abp-vnext-pro:https://github.com/WangJunZzz/abp-vnext-pro
[2]iEricLee的ABP博客:https://www.cnblogs.com/YGYH/
[3]cms-kit:https://github.com/abpframework/abp/tree/dev/modules/cms-kit
[4]基于ABP Framework實現領域驅動設計

人工智能干貨推薦5802c98b20eac1a70a9b1c6b5792727d.jpeg專注于人工智能領域的技術分享

游戲元宇宙34164849c12facc4d6b45753cb36bdd2.jpeg專注于游戲領域的技術分享

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/284218.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/284218.shtml
英文地址,請注明出處:http://en.pswp.cn/news/284218.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

二、通過工廠方法來配置bean

調用靜態工廠方法創建 Bean是將對象創建的過程封裝到靜態方法中. 當客戶端需要對象時, 只需要簡單地調用靜態方法, 而不同關心創建對象的細節. 要聲明通過靜態方法創建的 Bean, 需要在 Bean 的 class 屬性里指定擁有該工廠的方法的類, 同時在 factory-method 屬性里指定工廠方法…

【GlobalMapper精品教程】019:基于DSM提取離散隨機點的高程信息

本文講解在globalmapper中,基于DSM提取離散隨機點的高程信息,配套數據為data019.rar。 文章目錄 1. 離散點創建2. 提取離散點高程信息3. 高程標注1. 離散點創建 本文在ArcGIS中,根據給定的范圍,隨機生成離散點,如下圖: 拓展閱讀: ArcGIS根據范圍創建隨機點教程:【ArcG…

shell腳本注意點

2019獨角獸企業重金招聘Python工程師標準>>> 直接命令行寫腳本的時候,可以用 ; 分割,或 也可以直接回車,然后在繼續寫腳本在使用 方括號[ ] 的時候,里面空格兩邊都必須要有空格,比如 [ $a -gt 3 ] 在方括號…

C語言編程規范--------2 注釋

2.1 注釋的原則 注釋的目的是解釋代碼的目的、功能和采用的方法,提供代碼以外的信息,幫助讀者理解代碼,防止沒必要的重復注釋信息。 示例:如下注釋意義不大。 /* if receive_flag is TRUE */ if (receive_flag) 而如下的注釋則給出…

備戰金九銀十:RabbitMQ有5種工作模式(6)

RabbitMQ是實現了高級消息隊列協議(AMQP)的開源消息代理軟件(亦稱面向消息的中間件)。RabbitMQ服務器是用Erlang語言編寫的,而集群和故障轉移是構建在開放電信平臺框架上的。所有主要的編程語言均有與代理接口通訊的客…

【GlobalMapper精品教程】020:Lidar點云數據分類(自動分類、手動分類)案例詳解

航測點云通常跟DSM一致,即包含植被、房屋等信息,必須進行點云分類、過濾,才能生成準確的高程點、等高線和DEM等地形數據。本文以案例的形式詳細講解globalmapper23中點云工具及使用方法。 文章目錄 1. 點云分類2. 創建地面高程格網3. 地形繪制4. 格網轉點云5. 點云抽稀6. 點…

社交網絡圖中結點的“重要性“計算(Dijkstra + SPFA + Floyd + 模板)

題目鏈接: 無 題目大意: 求一個點到其他所有點的最短距離和,保證圖連通。 解題過程: 剛開始用 Floyd 水過的,后來用換了幾種方法,不錯的模板題,Floyd 的時候,要用 vector 存邊&#…

web布局固定寬度+變化寬度實現思路

前言 頁面當中常規布局我想大家都會的&#xff0c;但有些布局是常規布局中實現不了的&#xff0c;比如變寬和固寬結合的&#xff0c;需要實現(300px)&#xff0b;(100%&#xff0d;300px)的兩列布局。以下樣式代碼前提均為盒模型為border-sizing 的前提下。 html部分 <div c…

CSS3 nth 偽類選擇器

考察下面的 HTML 代碼片段&#xff1a; <div><section>section 1</section><section>section 2</section><ul><li>item 1</li><li><ul><li>sub item 1</li><li>sub item 2</li><li>…

RedisCluster的安裝、部署、擴容和 Java客戶端調用

Redis下載 官網地址&#xff1a;http://redis.io/ 中文官網地址&#xff1a;http://www.redis.cn/ 下載地址&#xff1a;http://download.redis.io/releases/ 安裝 # &#xff08;三臺&#xff09;安裝 C 語言需要的 GCC 環境 yum install -y gcc-c yum install -y wget # 下…

【CloudCompare教程】001:CloudCompare中文版下載與安裝圖文教程

CloudCompare是一款功能強大的點云后處理軟件,本文講解CloudCompare中文版下載與安裝方法。 文章目錄 一、CloudCompare下載地址二、CloudCompare安裝教程三、CloudCompare中文設置一、CloudCompare下載地址 官方下載地址:http://www.danielgm.net/cc/release/ 二、CloudComp…

ML.NET相關資源整理

在人工智能領域&#xff0c;無論是機器學習&#xff0c;還是深度學習等&#xff0c;Python編程語言都是絕對的主流&#xff0c;盡管底層都是C實現的&#xff0c;似乎人工智能和C#/F#編程語言沒什么關系。在人工智能的工程實現&#xff0c;通常都是將Python訓練好的人工智能模型…

帶參數的宏替換

帶參數的宏替換因各種需求疊加&#xff0c;替換規則很怪異&#xff1a; 1、首先將實參替換形參&#xff0c;并展開宏 2、如果1步展開后&#xff0c;有#或者##&#xff0c;那么停止替換。 3、如果1步展開后&#xff0c;沒有#或者##&#xff0c;且參數也是宏&#xff0c;那么繼續…

JAVA學習日志(7-1-繼承)

為什么80%的碼農都做不了架構師&#xff1f;>>> 繼承 1.提高代碼復用性 2.讓類與類之間產生關系&#xff0c;有了這個關系才有了多態的特性 **不要為了獲取其他類的功能&#xff0c;簡化代碼而繼承&#xff0c; 必須是類與類之間有所屬關系才可以繼承&#xff0c;所…

BZOJ 1370: [Baltic2003]Gang團伙 [并查集 拆點 | 種類并查集WA]

題意&#xff1a; 朋友的朋友是朋友&#xff0c;敵人的敵人是朋友&#xff1b;朋友形成團伙&#xff0c;求最多有多少團伙 種類并查集WA了一節課&#xff0c;原因是&#xff0c;只有那兩種關系才成立&#xff0c;諸如朋友的敵人是朋友之類的都不成立&#xff01; 所以拆點做吧 …

常見Lidar點云數據處理及可視化軟件匯總

常見的點云處理及可視化軟件有&#xff1a; CloudCompare、Globalmapper、Pix4d、ArcGIS&#xff08;Pro&#xff09;、Lidar 360、PCL等等。 文章目錄1. CloudCompare2. Globalmapper3. Pix4d4. ArcGIS&#xff08;Pro&#xff09;5. Lidar 3606. PCL1. CloudCompare CloudCo…

Spring 自帶工具類匯總

斷言 斷言是一個邏輯判斷&#xff0c;用于檢查不應該發生的情況 Assert 關鍵字在 JDK1.4 中引入&#xff0c;可通過 JVM 參數-enableassertions開啟 SpringBoot 中提供了 Assert 斷言工具類&#xff0c;通常用于數據合法性檢查 // 要求參數 object 必須為非空&#xff08;Not…

解決new Thread().Start導致高并發CPU 100%的問題

背景之前接手一個項目的時候&#xff0c;發現到處是new Thread(()>{ //do something }).Start();這么做的目的&#xff0c;無非是為了減少頁面等待時間提高用戶體驗&#xff0c;把一些浪費時間的操作放到新線程中在后臺運行。問題但是這樣帶來的問題是大量的創建線程&#x…

基于 HTML5 Canvas 繪制的電信網絡拓撲圖

電信網結構&#xff08;telecommunication network structure&#xff09;是指電信網各種網路單元按技術要求和經濟原則進行組合配置的組合邏輯和配置形式。組合邏輯描述網路功能的體系結構&#xff0c;配置形式描述網路單元的鄰接關系&#xff0c;即以交換中心&#xff08;或節…