基于Domain Driven Design&Clean Architecture原则分层的新启动模板
本文的內(nèi)容將在0.18.0中發(fā)布. Abp中文網(wǎng)將同步更新框架.敬請期待...
MVC應(yīng)用程序啟動模板
介紹
MVC應(yīng)用程序啟動模板是基于領(lǐng)域驅(qū)動設(shè)計(DDD)分層(或根據(jù)偏好分層)的應(yīng)用程序結(jié)構(gòu).
在這篇文檔中詳細(xì)介紹了解決方案結(jié)構(gòu)和項目
參閱ASP.NET Core MVC 模板入門創(chuàng)建此模板的新解決方案并運行它.
參閱ASP.NET Core MVC 教程學(xué)習(xí)使用此模板開發(fā)應(yīng)用程序.
如何開始
你要以使用ABP CLI創(chuàng)建基于此啟動模板的新項目,或者你也可以在入門頁面創(chuàng)建并下載項目. 在這里我們使用CLI創(chuàng)建新項目.
如果未安裝ABP CLI,第一步是安裝ABP CLI
然后使用?abp new?命令在空文件夾中創(chuàng)建新解決方案:
abp new Acme.BookStore -t mvcAcme.BookStore?是解決方案的名稱, 如YourCompany.YourProduct. 你可以使用單級或多級名稱.
示例中指定了啟動模板 (-t?或?--template?選項). 不過?mvc?是默認(rèn)模板,即使未指定也會創(chuàng)建?MVC?的模板項目.
指定數(shù)據(jù)庫提供程序
MVC模板支持以下數(shù)據(jù)庫提供程序:
ef: Entity Framework Core (默認(rèn))
mongodb: MongoDB
使用?-d?(或?--database-provider) 選項指定數(shù)據(jù)庫提供程序:
abp new Acme.BookStore -d mongodb創(chuàng)建分層解決方案
使用?--tiered?選項創(chuàng)建分層解決方案, Web與WebApi層在物理上是分開的. 如果未指定,CLI會創(chuàng)建一個分層的解決方案,這個解決方案沒有那么復(fù)雜,適合大多數(shù)場景.
abp new Acme.BookStore --tiered有關(guān)分層的方法,請參閱下面的"分層結(jié)構(gòu)"部分.
解決方案結(jié)構(gòu)
根據(jù)命令的選項,會創(chuàng)建略有不同的解決方案結(jié)構(gòu).
默認(rèn)結(jié)構(gòu)
如果未指定選項,你會得到如下所示的解決方案:
項目組織在src和test文件夾中.?src文件夾包含實際應(yīng)用程序,該應(yīng)用程序基于前面提到的DDD原則進(jìn)行分層. 下圖展示了解決方案的層和項目的依賴關(guān)系:
下面介紹解決方案中的項目及依賴關(guān)系.
.Domain.Shared 項目
項目包含常量,枚舉和其他對象,這些對象實際上是領(lǐng)域?qū)拥囊徊糠?但是解決方案中所有的層/項目中都會使用到.
例如?BookType?枚舉和?BookConts?類 (可能是?Book?實體用到的常數(shù)字段,像MaxNameLength)都適合放在這個項目中.
該項目不依賴解決方案中的其他項目. 其他項目直接或間接依賴該項目
.Domain 項目
解決方案的領(lǐng)域?qū)? 它主要包含?實體, 集合根,?領(lǐng)域服務(wù),?值類型,?倉儲接口?和解決方案的其他領(lǐng)域?qū)ο?
例如?Book?實體和?IBookRepository?接口都適合放在這個項目中.
它依賴?.Domain.Shared?項目,因為項目中會用到它的一些常量,枚舉和定義其他對象.
.Application.Contracts 項目
項目主要包含?應(yīng)用服務(wù)?interfaces?和應(yīng)用層的?數(shù)據(jù)傳輸對象?(DTO). 它用于分離應(yīng)用層的接口和實現(xiàn). 這種方式可以將接口項目做為約定包共享給客戶端.
它依賴?.Domain.Shared?因為它可能會在應(yīng)用接口和DTO中使用常量,枚舉和其他的共享對象.
.Application 項目
項目包含?.Application.Contracts?項目的?應(yīng)用服務(wù)?接口實現(xiàn).
它依賴?.Application.Contracts?項目, 因為它需要實現(xiàn)接口與使用DTO.
它依賴?.Domain?項目,因為它需要使用領(lǐng)域?qū)ο?實體,倉儲接口等)執(zhí)行應(yīng)用程序邏輯.
.EntityFrameworkCore 項目
這是集成EF Core的項目. 它定義了?DbContext?并實現(xiàn)?.Domain?項目中定義的倉儲接口.
它依賴?.Domain?項目,因為它需要引用實體和倉儲接口.
只有在你使用了EF Core做為數(shù)據(jù)庫提供程序時,此項目才會可用. 如果選擇的是其他數(shù)據(jù)庫提供程序那么項目的名稱會改變
.EntityFrameworkCore.DbMigrations 項目
包含解決方案的EF Core數(shù)據(jù)庫遷移. 它有獨立的?DbContext?來專門管理遷移.
ABP是一個模塊化的框架,理想的設(shè)計是讓每個模塊都有自己的?DbContext?類. 這時用于遷移的?DbContext?就會發(fā)揮作用. 它將所有的?DbContext?配置統(tǒng)一到單個模型中以維護(hù)單個數(shù)據(jù)庫的模式. 對于更高級的場景,可以程序可以擁有多個數(shù)據(jù)庫(每個數(shù)據(jù)庫有一個或多個模塊表)和多個遷移DbContext(每個都維護(hù)不同的數(shù)據(jù)庫模式)
需要注意,遷移?DbContext?僅用于數(shù)據(jù)庫遷移,而不在運行時使用.
它依賴?.EntityFrameworkCore?項目,因為它重用了應(yīng)用程序的?DbContext?配置 .
只有在你使用了EF Core做為數(shù)據(jù)庫提供程序時,此項目才會可用.
.DbMigrator 項目
這是一個控制臺應(yīng)用唾棄,它簡化了在開發(fā)和生產(chǎn)環(huán)境執(zhí)行數(shù)據(jù)庫遷移的操作.當(dāng)你使用它時;
必要時創(chuàng)建數(shù)據(jù)庫(沒有數(shù)據(jù)庫時).
應(yīng)用未遷移的數(shù)據(jù)庫遷移.
初始化種子數(shù)據(jù)(當(dāng)你需要時).
這個項目有自己的?appsettings.json?文件. 所以如果要更改數(shù)據(jù)庫連接字符串,請記得也要更改此文件.
初始化種子數(shù)據(jù)很很要,ABP具有模塊化的種子數(shù)據(jù)基礎(chǔ)設(shè)施. 種子數(shù)據(jù)的更多信息,請參閱文檔.
雖然創(chuàng)建數(shù)據(jù)庫和應(yīng)用遷移似乎只對關(guān)系數(shù)據(jù)庫有用,但即使您選擇NoSQL數(shù)據(jù)庫提供程序(如MongoDB),也會生成此項目. 這時,它會為應(yīng)用程序提供必要的初始數(shù)據(jù).
它依賴?.EntityFrameworkCore.DbMigrations?項目 (針對EF Core),因為它需要訪問遷移文件.
它依賴?.Application.Contracts?項目,因為它需要訪問權(quán)限定義在初始化種子數(shù)據(jù)時為管理員用戶賦予所有權(quán)限.
.HttpApi 項目
用于定義API控制器.
大多數(shù)情況下,你不需要手動定義API控制器,因為ABP的動態(tài)API功能會根據(jù)你的應(yīng)用層自動創(chuàng)建API控制器. 但是,如果你需要編寫API控制器,那么它是最合適的地方.
它依賴?.Application.Contracts?項目,因為它需要注入應(yīng)用服務(wù)接口.
.HttpApi.Client 項目
定義C#客戶端代理使用解決方案的HTTP API項目. 可以將上編輯共享給第三方客戶端,使其輕松的在DotNet應(yīng)用程序中使用你的HTTP API(其他類型的應(yīng)用程序可以手動或使用其平臺的工具來使用你的API).
ABP有動態(tài) C# API 客戶端功能,所以大多數(shù)情況下你不需要手動的創(chuàng)建C#客戶端代理.
.HttpApi.Client.ConsoleTestApp?項目是一個用于演示客戶端代理用法的控制臺應(yīng)用程序.
它依賴?.Application.Contracts?項目,因為它需要使用應(yīng)用服務(wù)接口和DTO.
如果你不需要為API創(chuàng)建動態(tài)C#客戶端代理,可以刪除此項目和依賴項
.Web 項目
包含應(yīng)用程序的用戶界面(UI). 包括Razor頁面,javascript文件,樣式文件,圖片等...
包含應(yīng)用程序主要的?appsettings.json?配置文件,用于配置數(shù)據(jù)庫連接字符串和應(yīng)用程序的其他配置
依賴?.HttpApi?項目,因為UI層需要使用解決方案的API和應(yīng)用服務(wù)接口.
如果查看?.Web.csproj?源碼, 你會看到對?.Application?和?.EntityFrameworkCore.DbMigrations?項目的引用.
在編寫UI層時實際上不需要這些引用. 因為UI層通常不依賴于EF Core或應(yīng)用層的實現(xiàn). 這個啟動模板已經(jīng)為分層部署做好了準(zhǔn)備,API層托管在不同與UI層的服務(wù)器中.
但是如果你不選擇?--tiered?選項, .Web項目會有這些引用,以便能夠?qū)eb,Api和應(yīng)用層托管在單個應(yīng)用程序站點.
你可以在表示層中使用領(lǐng)域?qū)嶓w和倉儲,但是根據(jù)DDD的理論,這被認(rèn)為是一種不好的做法.
測試項目
解決方案有多個測試項目,每一層都會有一個:
.Domain.Tests?用于測試領(lǐng)域?qū)?
.Application.Tests?用于測試應(yīng)用層.
.EntityFrameworkCore.Tests?用于測試EF Core配置與自定義倉儲.
.Web.Tests?用于測試UI.
.TestBase?所有測試項目的基礎(chǔ)(共享)項目.
此外,?.HttpApi.Client.ConsoleTestApp?是一個控制臺應(yīng)用程序(不是自動化測試項目),它用于演示DotNet應(yīng)用程序中HTTP API的用法.
測試項目已為集成測試做好準(zhǔn)備:
它完成集成到ABP框架和應(yīng)用程序的所有服務(wù).
如果數(shù)據(jù)庫提供程序是EF Core,測試項目會使用SQLite內(nèi)存數(shù)據(jù)庫,如果是MongoDB,它使用Mongo2Go庫.
授權(quán)被禁用,任何的應(yīng)用服務(wù)都可以在測試中輕松調(diào)用.
你依然可以編寫單元測試,只不過它很難寫(因為你需要準(zhǔn)備mock/fake對象),但它的運行速度更快(因為只測試單個類并跳過所有初始化過程).
如何運行?
設(shè)置.Web為啟動項目. 默認(rèn)用戶名?admin, 密碼?1q2w3E*.
更多信息請參閱ASP.NET Core MVC 模板入門.
分層結(jié)構(gòu)
如果你按上面的描述指定了?--tiered?選項,會創(chuàng)建分層解決方案. 分層結(jié)構(gòu)的目的是將Web應(yīng)用程序和HTTP API部署到不同的服務(wù)器:
瀏覽器渲染HTML,執(zhí)行CSS和JavaScript來運行UI.
Web服務(wù)器托管靜態(tài)文件(CSS,JavaScript,圖片...等)和動態(tài)組件(如Razor頁面),它通過HTTP請求到API服務(wù)器執(zhí)行應(yīng)用程序的業(yè)務(wù)邏輯.
API服務(wù)器托管HTTP API,使用應(yīng)用程序的應(yīng)用層和領(lǐng)域?qū)訄?zhí)行業(yè)務(wù)邏輯.
最后數(shù)據(jù)庫服務(wù)器托管數(shù)據(jù)庫.
與之前默認(rèn)結(jié)構(gòu)的三層部署比較,分層解決方案允許四層部署.
除非你真的需要四層部署,一般建議采用默認(rèn)結(jié)構(gòu),它更易于開發(fā),部署和維護(hù).
解決方案結(jié)構(gòu)如下所示:
與默認(rèn)結(jié)構(gòu)不同,我們得到了兩個新項目:?.IdentityServer?和?.HttpApi.Host.
.IdentityServer 項目
用于其他項目的身份驗證服務(wù)器.?.Web項目使用OpenId Connect身份驗證獲取當(dāng)前用戶的身份和訪問令牌. 然后使用訪問令牌調(diào)用HTTP API服務(wù)器. HTTP API服務(wù)器使用bearer token從訪問令牌獲取聲明授權(quán)當(dāng)前用戶.
ABP使用開源的IdentityServer4框架做應(yīng)用程序間的身份驗證. 有關(guān)IdentityServer4和OpenId Connect協(xié)議的詳細(xì)信息請參閱IdentityServer4文檔.
它有自己的appsettings.json文件(數(shù)據(jù)庫連接字符串等其他配置).
.HttpApi.Host 項目
該項目是一個承載解決方案API的應(yīng)用程序.
它有自己的appsettings.json文件(數(shù)據(jù)庫連接字符串等其他配置).
.Web 項目
與默認(rèn)結(jié)構(gòu)一樣,包含應(yīng)用程序的用戶界面(UI). 包括Razor頁面,javascript文件,樣式文件,圖片等...
項目包含appsetting.json文件,但沒有連接字符串配置, 它不需要連接到數(shù)據(jù)庫. 文件中主要包含遠(yuǎn)程API服務(wù)器端點和身份驗證服務(wù)器
前置條件
Redis: 應(yīng)用程序使用Redis做分布式緩存,你需要安裝并運行Redis.
如何運行?
你應(yīng)該按照以下順序運行應(yīng)用:
首先運行.IdentityServer,因為其他應(yīng)用程序依賴它做身份驗證.
然后運行.HttpApi.Server,因為.Web應(yīng)用程序需要訪問HTTI API.
最后運行.Web并登錄到應(yīng)用程序(用戶名:?admin?密碼:?1q2w3E*).
.NET社區(qū)新聞,深度好文,歡迎訪問公眾號文章匯總?http://www.csharpkit.com?
總結(jié)
以上是生活随笔為你收集整理的基于Domain Driven Design&Clean Architecture原则分层的新启动模板的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: VS Code 1.35 发布!全新 l
- 下一篇: 感谢诸君的陪伴,见证微信 SDK 的成长