0.18.0將於近期釋出, 本文內容針對於0.18.0版本.
MVC模組啟動模板
可用此模板開發基於模組開發最佳實踐和約定的可復用 應用程式模組 . 它同樣適用於開發微服務.
如何開始?
你可以使用ABP CLI建立基於此啟動模板的新專案,或者你也可以在入門頁面建立並下載專案. 在這裡我們使用CLI建立新專案.
如果未安裝ABP CLI,第一步是安裝ABP CLI
dotnet tool install -g Volo.Abp.Cli
然後使用 abp new
命令在空檔案夾中建立新解決方案:
abp new Acme.IssueManagement -t mvc-module
-
Acme.IssueManagement
是解決方案的名稱, 如YourCompany.YourProduct. 你可以使用單級或多級名稱.
無使用者介面
預設情況模板附帶一個UI,你可以使用--no-ui
選項指定不包含UI層.
abp new Acme.IssueManagement -t mvc-module --no-ui
解決方案結構
根據命令的選項,會建立略有不同的解決方案結構. 如果未指定選項,你會得到如下所示的解決方案:
專案組織在src
和test
和host
檔案夾中:
-
src
檔案夾包含基於DDD原則分層的實際模組. -
test
檔案夾包含單元和整合測試. -
host
檔案夾包含具有不同配置的應用程式,用於演示在應用程式中如何託管模組. 這些不是模組的一部分,但開發時會很有用.
下圖展示了模組的層和專案的依賴關係:
下麵介紹解決方案中的專案及依賴關係:
.Domain.Shared 專案
專案包含常量,列舉和其他物件,這些物件實際上是領域層的一部分,但是解決方案中所有的層/專案中都會使用到.
例如 IssueType
列舉和 IssueConts
類 (可能是 Issue
物體用到的常數欄位,像MaxTitleLength
)都適合放在這個專案中.
-
該專案不依賴解決方案中的其他專案. 其他專案直接或間接依賴該專案.
.Domain 專案
解決方案的領域層. 它主要包含 物體, 集合根, 領域服務, 值型別, 倉儲介面 和解決方案的其他領域物件.
例如 Issue
物體, IssueManager
領域服務和 IIssueRepository
介面都適合放在這個專案中.
-
它依賴
.Domain.Shared
專案,因為專案中會用到它的一些常量,列舉和定義其他物件.
.Application.Contracts 專案
專案主要包含 應用服務 interfaces 和應用層的 資料傳輸物件 (DTO). 它用於分離應用層的介面和實現. 這種方式可以將介面專案做為約定包共享給客戶端.
例如 IIssueAppService
介面和 IssueCreationDto
類都適合放在這個專案中.
-
它依賴
.Domain.Shared
因為它可能會在應用介面和DTO中使用常量,列舉和其他的共享物件.
.Application 專案
專案包含 .Application.Contracts
專案的 應用服務 介面實現.
例如 IssueAppService
類適合放在這個專案中.
-
它依賴
.Application.Contracts
專案, 因為它需要實現介面與使用DTO. -
它依賴
.Domain
專案,因為它需要使用領域物件(物體,倉儲介面等)執行應用程式邏輯.
.EntityFrameworkCore 專案
這是整合EF Core的專案. 它定義了 DbContext
並實現 .Domain
專案中定義的倉儲介面.
-
它依賴
.Domain
專案,因為它需要取用物體和倉儲介面.
如果不需要使用EF Core,可以刪除此專案.
.MongoDB 專案
這是整合MongoDB的專案.
-
它依賴
.Domain
專案,因為它需要取用物體和倉儲介面.
如果不需要使用MongoDB,可以刪除此專案.
Test 專案
解決方案有多個測試專案,每一層都會有一個:
-
.Domain.Tests
用於測試領域層. -
.Application.Tests
用於測試應用層. -
.EntityFrameworkCore.Tests
用於測試EF Core配置與自定義倉儲. -
.MongoDB.Tests
用於測試MongoDB配置與自定義倉儲. -
.TestBase
所有測試專案的基礎(共享)專案.
此外, .HttpApi.Client.ConsoleTestApp
是一個控制檯應用程式(不是自動化測試專案),它用於演示DotNet應用程式中HTTP API的用法.
測試專案是用於做整合測試的:
-
它完全整合到ABP框架和應用程式的所有服務.
-
如果資料庫提供程式是EF Core,測試專案會使用SQLite記憶體資料庫,如果是MongoDB,它使用Mongo2Go庫.
-
授權被禁用,任何的應用服務都可以在測試中輕鬆呼叫.
你依然可以編寫單元測試,只不過它很難寫(因為你需要準備mock/fake物件),但它的執行速度更快(因為只測試單個類並跳過所有初始化過程).
領域層和應用層測試使用EF Core. 如果你刪除了EF Core整合專案或者要使用MongoDB測試這些層,需要手動的修改專案取用和依賴.
Host 專案
解決方案中有一些宿主應用程式可以在開發時執行模組. 在開發時會很有用. 除了正在開發的模組外,宿主應用程式包括其他模組:
宿主應用程式支援兩種型別的場景.
單體 (統一) 應用場景
如果模組含有UI, 那麼 .Web.Unified
應用程式於在一個站點上託管UI和API. 它有自己的 appsettings.json
配置檔案(包括資料庫連線字串)和EF Core資料庫遷移.
.Web.Unified
應用程式有一個名為YourProjectName_Unified
的資料庫(本例中名為 IssueManagement_Unified).
如果你選擇了
--no-ui
選項, 這個專案不會出現在你的解決方案中.
如何執行?
將其設定成啟動項, 使用包管理控制檯執行 Update-Database
命令遷移資料庫,然後執行應用程式. 預設使用者名稱: admin
密碼: 1q2w3E*
.
分離部署&資料庫 場景
在這個場景中,有三個應用程式;
-
.IdentityServer
應用程式是其他應用程式使用的身份驗證伺服器,它有自己的appsettings.json
包含資料庫連線字串和其他配置. -
.HttpApi.Host
託管模組的HTTP API. 它有自己的appsettings.json
包含資料庫連線字串和其他配置. -
.Web.Host
託管模組的UI. 它包含appsettings.json
檔案, 但是其中沒有資料庫連線字串, 因為它不需要連線到資料庫, 它主要呼叫遠端API伺服器和身份認證伺服器.
下圖展示了應用程式的關係:
.Web.Host
專案使用OpenId Connect身份認證從.IdentityServer
獲取當前使用者的身份和訪問令牌. 然後使用訪問令牌呼叫 .HttpApi.Host
. HTTP API 伺服器使用bearer token驗證訪問令牌獲取當前使用者宣告並授權使用者.
如何執行?
你需要按照以下順序執行應用程式:
-
首先, 執行
.IdentityServer
,因為其他應用程式依賴它做身份認證. -
然後執行
.HttpApi.Host
,因為.Web.Host
應用程式使用API介面. -
最後執行
.Web.Host
使用使用者名稱:admin
密碼:1q2w3E*
登入到應用程式.
原文地址:https://mp.weixin.qq.com/s/gyVPZgp6SC9NNBC6DLoMug
.NET社群新聞,深度好文,歡迎訪問公眾號文章彙總 http://www.csharpkit.com
朋友會在“發現-看一看”看到你“在看”的內容