實(shí)現(xiàn)領(lǐng)域驅(qū)動(dòng)設(shè)計(jì) - 使用ABP框架 - 解決方案概覽
.NET解決方案的分層
下圖顯示了使用ABP的 應(yīng)用啟動(dòng)模板 創(chuàng)建的Visual Studio解決方案:

解決方案名稱為問(wèn)題跟蹤,它由多個(gè)項(xiàng)目組成。通過(guò)考慮DDD原則以及開(kāi)發(fā)和部署實(shí)踐,該解決方案是分層的。下面的小節(jié)解釋了解決方案中的項(xiàng)目
應(yīng)用層
應(yīng)用層也分為2個(gè)項(xiàng)目
- IssueTracking.Application.Contracts 包含應(yīng)用程序服務(wù)接口和這些接口使用的dto。這個(gè)項(xiàng)目可以被客戶端應(yīng)用程序共享(包括UI)
- IssueTracking.Application 是實(shí)現(xiàn)Contracts項(xiàng)目中定義的接口的基本應(yīng)用程序?qū)印?/li>
表示層
- IssueTracking.Web 是一個(gè)ASP.NET Core MVC / Razor Pages 應(yīng)用程序, 這是唯一為應(yīng)用程序和api服務(wù)的可執(zhí)行應(yīng)用程序
遠(yuǎn)程服務(wù)層
- IssueTracking.HttpApi 項(xiàng)目包含解決方案定義的HTTP接口。它通常包含MVC控制器和相關(guān)模型。因此,您可以在這個(gè)項(xiàng)目中編寫(xiě)HTTP接口。
- IssueTracking.HttpApi.Client 當(dāng)您有一個(gè)需要使用HTTP接口的c#應(yīng)用程序時(shí),此項(xiàng)目是有用的。一旦客戶端應(yīng)用程序引用了這個(gè)項(xiàng)目,它就可以直接注入和使用應(yīng)用程序服務(wù)。這得益于ABP框架的 動(dòng)態(tài)c#客戶端API代理系統(tǒng)
友情提示: There is a Console Application in the test folder of the solution,named IssueTracking.HttpApi.Client.ConsoleTestApp. It simply uses the IssueTracking.HttpApi.Client project to consume the APIs exposed by the application. It is just a demo application and you can safely delete it. You can even delete the IssueTracking.HttpApi.Client project if you think that you don't need to them.
基礎(chǔ)設(shè)施層
在DDD實(shí)現(xiàn)中,您可能有一個(gè)單一的基礎(chǔ)設(shè)施項(xiàng)目來(lái)實(shí)現(xiàn)所有的抽象和集成,或者您可能對(duì)每個(gè)依賴項(xiàng)有不同的項(xiàng)目
我們建議采取一種平衡的方法;為主要的基礎(chǔ)設(shè)施依賴項(xiàng)(如 Entity Framework Core)創(chuàng)建單獨(dú)的項(xiàng)目,為其他基礎(chǔ)設(shè)施創(chuàng)建一個(gè)通用的基礎(chǔ)設(shè)施項(xiàng)目
ABP的啟動(dòng)解決方案有兩個(gè) Entity Framework Core 集成項(xiàng)目
- IssueTracking.EntityFrameworkCore 它是EF Core的基本集成包。你的應(yīng)用程序的DbContext,數(shù)據(jù)庫(kù)映射,存儲(chǔ)庫(kù)的實(shí)現(xiàn)和其他EF Core相關(guān)的東西都在這里
- IssueTracking.EntityFrameworkCore.DbMigrations 是一個(gè)管理Code First數(shù)據(jù)庫(kù)遷移的特殊項(xiàng)目。在這個(gè)項(xiàng)目中有一個(gè)單獨(dú)的DbContext來(lái)跟蹤遷移。除了需要?jiǎng)?chuàng)建一個(gè)新的數(shù)據(jù)庫(kù)遷移或添加一個(gè)具有一些數(shù)據(jù)庫(kù)表的 應(yīng)用程序模塊 并自然需要?jiǎng)?chuàng)建一個(gè)新的數(shù)據(jù)庫(kù)遷移外,您通常不會(huì)過(guò)多地涉及這個(gè)項(xiàng)目
你可能想知道為什么 EF Core 會(huì)有兩個(gè)項(xiàng)目。它主要與 模塊化 有關(guān)。每個(gè)模塊都有自己獨(dú)立的DbContext,應(yīng)用程序也有一個(gè)DbContext。DbMigrations項(xiàng)目包含一個(gè)模塊的聯(lián)合,用于跟蹤和應(yīng)用單個(gè)遷移路徑。雖然大多數(shù)時(shí)候你不需要知道它,但你可以查看 EF Core遷移文檔 以獲得更多信息
其他項(xiàng)目
還有一個(gè)項(xiàng)目,IssueTracking.DbMigrator,這是一個(gè)簡(jiǎn)單的控制臺(tái)應(yīng)用程序,它執(zhí)行遷移數(shù)據(jù)庫(kù)和 播種 初始數(shù)據(jù)。這是一個(gè)有用的實(shí)用程序應(yīng)用程序,您可以在開(kāi)發(fā)環(huán)境和生產(chǎn)環(huán)境中使用它。
解決方案中項(xiàng)目的依賴關(guān)系
下圖顯示了解決方案(IssueTracking)中項(xiàng)目之間的基本依賴關(guān)系(項(xiàng)目引用)。IssueTracking部分因?yàn)楹?jiǎn)單沒(méi)顯示)

這些項(xiàng)目之前已經(jīng)解釋過(guò)了。現(xiàn)在,我們可以解釋依賴關(guān)系的原因
- Domain.Shared 是所有其他項(xiàng)目直接或間接依賴的項(xiàng)目。此項(xiàng)目里的所有類型均可被其他項(xiàng)目使用。
- Domain 只依賴 Domain.Shared。因?yàn)樗呀?jīng)是領(lǐng)域共享的一部分。例如,Domain.Shared 中的 IssueType 枚舉 可以被 Domain 項(xiàng)目中的 Issue 實(shí)體使用
- Application.Contracts 依賴 Domain.Shared。通過(guò)這種方式,您可以在dto中重用這些共享的類型。比如, 在Domain.Shared中的IssueType 枚舉 可以作為 CreateIssueDto 的一個(gè)屬性
- Application 依賴 Application.Contracts 。因?yàn)樗鼘?shí)現(xiàn)了應(yīng)用程序服務(wù)接口并使用其中的dto。它還依賴于 Domain,因?yàn)閼?yīng)用程序服務(wù)被實(shí)現(xiàn)為使用在領(lǐng)域?qū)又卸x的領(lǐng)域?qū)ο?/li>
- EntityFrameworkCore 依賴 Domain。因?yàn)樗鼘㈩I(lǐng)域?qū)ο?實(shí)體和值類型)映射到數(shù)據(jù)庫(kù)表(因?yàn)樗且粋€(gè)ORM),并實(shí)現(xiàn)領(lǐng)域中定義的存儲(chǔ)庫(kù)接口
- HttpApi 依賴 Application.Contracts。 因?yàn)樗锩娴?controller 會(huì)注入和使用應(yīng)用服務(wù)接口
- HttpApi.Client 依賴 Application.Contracts。因?yàn)樗梢韵袂懊娼忉尩哪菢邮褂脩?yīng)用程序服務(wù)
- Web 依賴 HttpApi。因?yàn)樗峁┰谄鋬?nèi)部定義的HTTP接口。而且,通過(guò)這種方式,它間接地依賴于 Application.Contracts 項(xiàng)目, 來(lái)使用頁(yè)面/組件中的應(yīng)用程序服務(wù)
基于DDD的應(yīng)用程序的執(zhí)行流程
下圖顯示了基于DDD模式開(kāi)發(fā)的web應(yīng)用程序的典型請(qǐng)求流

- 請(qǐng)求通常從UI上的用戶交互(用例)開(kāi)始,該用戶交互導(dǎo)致向服務(wù)器發(fā)出HTTP請(qǐng)求
- 表現(xiàn)層(或分布式服務(wù)層)中的MVC控制器或Razor頁(yè)面處理程序處理請(qǐng)求,并可以在此階段執(zhí)行一些橫切關(guān)注點(diǎn)(授權(quán)、驗(yàn)證、異常處理等)。控制器/頁(yè)面注入相關(guān)的應(yīng)用程序服務(wù)接口,并通過(guò)發(fā)送和接收dto調(diào)用其方法
- 應(yīng)用程序服務(wù)使用領(lǐng)域?qū)ο?實(shí)體、存儲(chǔ)庫(kù)接口、領(lǐng)域服務(wù)等)來(lái)實(shí)現(xiàn)用例。應(yīng)用層實(shí)現(xiàn)一些橫切關(guān)注點(diǎn)(授權(quán)、驗(yàn)證等)。應(yīng)用程序服務(wù)方法應(yīng)該是一個(gè)工作單元。這意味著它應(yīng)該是原子的。
- 大多數(shù)橫切關(guān)注點(diǎn)都是由ABP框架自動(dòng)且常規(guī)地實(shí)現(xiàn)的,通常不需要為它們編寫(xiě)代碼

浙公網(wǎng)安備 33010602011771號(hào)