之前的文章有提到ABP官方模板學習,有各種版本angular、vue以及application+MVC版本,官方下載就可以運行,但是我們是希望在那個框架的基礎上增加個人的功能,而原有的模板大多數都是做了封裝,並不便於入門者學習和研究,今天我們引用另外個模板,簡單的介紹下模板結構以及按照原有架構新增一個功能模塊,更方便入學者上手!
一、項目模板下載
項目地址:https://abp.io/get-started
輸入項目名稱創建即可
二、項目結構
三、項目依賴關系及各項目功能說明
(官方都有說明文檔,在此就是為了記錄下,方便讀者直接查看)
解決方案的層和項目的依賴關系:
項目及依賴關系:
.Domain.Shared 項目
項目包含常量,枚舉和其他對象,這些對象實際上是領域層的一部分,但是解決方案中所有的層/項目中都會使用到.
例如 BookType
枚舉和 BookConsts
類 (可能是 Book
實體用到的常數字段,像MaxNameLength
)都適合放在這個項目中.
- 該項目不依賴解決方案中的其他項目. 其他項目直接或間接依賴該項目
.Domain 項目
解決方案的領域層. 它主要包含 實體, 集合根, 領域服務, 值類型, 倉儲接口 和解決方案的其他領域對象.
例如 Book
實體和 IBookRepository
接口都適合放在這個項目中.
- 它依賴
.Domain.Shared
項目,因為項目中會用到它的一些常量,枚舉和定義其他對象.
.Application.Contracts 項目
項目主要包含 應用服務 interfaces 和應用層的 數據傳輸對象 (DTO). 它用於分離應用層的接口和實現. 這種方式可以將接口項目做為約定包共享給客戶端.
例如 IBookAppService
接口和 BookCreationDto
類都適合放在這個項目中.
- 它依賴
.Domain.Shared
因為它可能會在應用接口和DTO中使用常量,枚舉和其他的共享對象.
.Application 項目
項目包含 .Application.Contracts
項目的 應用服務 接口實現.
例如 BookAppService
類適合放在這個項目中.
- 它依賴
.Application.Contracts
項目, 因為它需要實現接口與使用DTO. - 它依賴
.Domain
項目,因為它需要使用領域對象(實體,倉儲接口等)執行應用程序邏輯.
.EntityFrameworkCore 項目
這是集成EF Core的項目. 它定義了 DbContext
並實現 .Domain
項目中定義的倉儲接口.
- 它依賴
.Domain
項目,因為它需要引用實體和倉儲接口.
只有在你使用了EF Core做為數據庫提供程序時,此項目才會可用. 如果選擇的是其他數據庫提供程序那么項目的名稱會改變
.EntityFrameworkCore.DbMigrations 項目
包含解決方案的EF Core數據庫遷移. 它有獨立的 DbContext
來專門管理遷移.
ABP是一個模塊化的框架,理想的設計是讓每個模塊都有自己的 DbContext
類. 這時用於遷移的 DbContext
就會發揮作用. 它將所有的 DbContext
配置統一到單個模型中以維護單個數據庫的模式. 對於更高級的場景,可以程序可以擁有多個數據庫(每個數據庫有一個或多個模塊表)和多個遷移DbContext
(每個都維護不同的數據庫模式)
需要注意,遷移 DbContext
僅用於數據庫遷移,而不在運行時使用.
- 它依賴
.EntityFrameworkCore
項目,因為它重用了應用程序的DbContext
配置 .
只有在你使用了EF Core做為數據庫提供程序時,此項目才會可用. 參閱Entity Framework Core遷移指南了解這個項目的詳細信息.
.DbMigrator 項目
這是一個控制台應用程序,它簡化了在開發和生產環境執行數據庫遷移的操作.當你使用它時;
- 必要時創建數據庫(沒有數據庫時).
- 應用未遷移的數據庫遷移.
- 初始化種子數據(當你需要時).
這個項目有自己的
appsettings.json
文件. 所以如果要更改數據庫連接字符串,請記得也要更改此文件.
初始化種子數據很重要,ABP具有模塊化的種子數據基礎設施. 種子數據的更多信息,請參閱文檔.
雖然創建數據庫和應用遷移似乎只對關系數據庫有用,但即使你選擇NoSQL數據庫提供程序(如MongoDB),也會生成此項目. 這時,它會為應用程序提供必要的初始數據.
- 它依賴
.EntityFrameworkCore.DbMigrations
項目 (針對EF Core),因為它需要訪問遷移文件. - 它依賴
.Application.Contracts
項目,因為它需要訪問權限定義在初始化種子數據時為管理員用戶賦予所有權限.
.HttpApi 項目
用於定義API控制器.
大多數情況下,你不需要手動定義API控制器,因為ABP的動態API功能會根據你的應用層自動創建API控制器. 但是,如果你需要編寫API控制器,那么它是最合適的地方.
- 它依賴
.Application.Contracts
項目,因為它需要注入應用服務接口.
.HttpApi.Client 項目
定義C#客戶端代理使用解決方案的HTTP API項目. 可以將上編輯共享給第三方客戶端,使其輕松的在DotNet應用程序中使用你的HTTP API(其他類型的應用程序可以手動或使用其平台的工具來使用你的API).
ABP有動態 C# API 客戶端功能,所以大多數情況下你不需要手動的創建C#客戶端代理.
.HttpApi.Client.ConsoleTestApp
項目是一個用於演示客戶端代理用法的控制台應用程序.
- 它依賴
.Application.Contracts
項目,因為它需要使用應用服務接口和DTO.
如果你不需要為API創建動態C#客戶端代理,可以刪除此項目和依賴項
.Web 項目
包含應用程序的用戶界面(UI).如果使用ASP.NET Core MVC UI, 它包括Razor頁面,javascript文件,樣式文件,圖片等...
包含應用程序主要的 appsettings.json
配置文件,用於配置數據庫連接字符串和應用程序的其他配置
- 依賴
.HttpApi
項目,因為UI層需要使用解決方案的API和應用服務接口.
如果查看
.Web.csproj
源碼, 你會看到對.Application
和.EntityFrameworkCore.DbMigrations
項目的引用.在編寫UI層時實際上不需要這些引用. 因為UI層通常不依賴於EF Core或應用層的實現. 這個啟動模板已經為分層部署做好了准備,API層托管在不同與UI層的服務器中.
但是如果你不選擇
--tiered
選項, .Web項目會有這些引用,以便能夠將Web,Api和應用層托管在單個應用程序站點.你可以在表示層中使用領域實體和倉儲,但是根據DDD的理論,這被認為是一種不好的做法.
Test 項目
解決方案有多個測試項目,每一層都會有一個:
.Domain.Tests
用於測試領域層..Application.Tests
用於測試應用層..EntityFrameworkCore.Tests
用於測試EF Core配置與自定義倉儲..Web.Tests
用於測試UI(適用於ASP.NET Core MVC UI)..TestBase
所有測試項目的基礎(共享)項目.
此外, .HttpApi.Client.ConsoleTestApp
是一個控制台應用程序(不是自動化測試項目),它用於演示.Net應用程序中HTTP API的用法.
測試項目是用於做集成測試的:
- 它完全集成到ABP框架和應用程序的所有服務.
- 如果數據庫提供程序是EF Core,測試項目會使用SQLite內存數據庫,如果是MongoDB,它使用Mongo2Go庫.
- 授權被禁用,任何的應用服務都可以在測試中輕松調用.
你依然可以編寫單元測試,只不過它很難寫(因為你需要准備mock/fake對象),但它的運行速度更快(因為只測試單個類並跳過所有初始化過程).
四、項目數據庫生成
修改數據庫配置文件,TestApp.BookStore.DbMigrator和TestApp.BookStore.Web中appsettings.json,修改為自己對應的數據連接串
使用EF Core Code First Migrations生成數據庫,在包管理控制台(PMC)中使用
Add-Migration Created_Book_Entity -c BookStoreDbContext
和 Update-Database -Context BookStoreDbContext
命令
完成之后可以看到創建的數據庫如下:
五、基礎數據生成
將項目TestApp.BookStore.DbMigrator設為啟動項目,初始化基礎數據
六、項目運行
設置.Web
為啟動項目. 默認用戶名 admin
, 密碼 1q2w3E*
.
魏雨彤他們兩室,所有弄完掛了18w多