第十五章:模組化開發 (Modular Development)
15.1 引言:一切皆模組
ABP Framework 的核心設計哲學就是 模組化。事實上,ABP 框架本身就是由數百個模組組成的 (Identity, AuditLogging, PermissionManagement 等)。
開發模組與開發應用程式非常相似,但模組的目標是 可重用性 (Reusability)。一個設計良好的模組應該可以被安裝到任何 ABP 應用程式中,並立即提供功能。
15.2 建立模組
1. 使用模組範本
ABP CLI 提供了專門的模組範本。
bash
abp new Volo.BookStore -t module這會產生一個與應用程式類似的分層結構,但專案名稱通常沒有 .Web 或 .Host (除非包含測試宿主)。
2. 模組結構
- Domain / Domain.Shared:定義實體、值物件、常數。這是模組的核心,不依賴任何外部技術。
- Application.Contracts:定義 DTO 與介面。這是模組對外暴露的契約。
- Application:實作業務邏輯。
- EntityFrameworkCore:定義
DbContext與 Repository。 - HttpApi:定義 Controller。
- HttpApi.Client:包含 C# Proxy,供其他微服務或客戶端呼叫此模組。
15.3 模組間的相依性
1. 引用其他模組
在 Module.cs 中使用 [DependsOn] 屬性。
csharp
[DependsOn(typeof(AbpIdentityApplicationModule))]
public class BookStoreApplicationModule : AbpModule
{
// ...
}2. 避免循環依賴
模組 A 依賴 模組 B,模組 B 又依賴 模組 A,這是絕對禁止的。
- 解法:提取共用部分到第三個模組 (如
SharedModule),或使用事件驅動解耦。
15.4 整合服務 (Integration Services)
當模組 A 需要與模組 B 互動時,我們有兩種策略。
1. 同步整合 (直接呼叫)
模組 A 引用 模組 B 的 Application.Contracts 套件,並直接注入服務介面。
- 優點:簡單、強型別。
- 缺點:模組 A 與 B 強耦合。若 B 不存在,A 無法運作。
csharp
public class OrderAppService : ApplicationService
{
private readonly IProductAppService _productAppService; // 來自 Product 模組
public async Task CreateAsync()
{
await _productAppService.DeductStockAsync(...);
}
}2. 非同步整合 (事件驅動)
模組 A 發布事件,模組 B 訂閱事件。
- 優點:完全解耦。模組 A 不需要知道 B 的存在。
- 缺點:流程較難追蹤。
3. 整合服務模式 (Integration Service Pattern)
若不想直接依賴其他模組的 AppService (因為 AppService 可能包含權限檢查或過多 DTO),可以在模組 B 的 Domain 層定義一個專門的 Integration Service。
- 這是一個純粹的領域服務,不依賴 DTO,只處理核心邏輯,供其他模組呼叫。
15.5 發布模組
1. 打包為 NuGet
模組通常以 NuGet 套件的形式分發。 在 .csproj 中設定:
xml
<PropertyGroup>
<IsPackable>true</IsPackable>
<Version>1.0.0</Version>
<Authors>YourName</Authors>
</PropertyGroup>執行打包指令:
bash
dotnet pack -c Release2. 建立 C# Proxy (針對模組)
如果您的模組將被用於微服務環境,您需要確保 HttpApi.Client 專案正確生成了 Proxy。
- 在
HttpApi.Client模組中,使用context.Services.AddHttpClientProxy<IBookAppService>();來註冊代理。
15.6 實戰練習
練習 1:建立一個 "評論 (Comment)" 模組
- 使用
abp new Volo.Comment -t module建立模組。 - 定義
Comment實體 (包含EntityType,EntityId,Content)。這是一個通用的評論模組,可以掛在任何實體上。 - 實作
CommentAppService。
練習 2:在主應用程式中使用模組
- 在現有的
BookStore應用程式中,加入Volo.Comment的專案引用 (或 NuGet 引用)。 - 在
BookStore的各層 Module 中加入[DependsOn]。 - 執行
DbMigrator,確保評論模組的資料表被建立。
練習 3:整合功能
- 在書籍詳情頁面,呼叫
CommentAppService顯示該書籍的評論。 - 實作 "新增評論" 功能。
15.7 總結
模組化是 ABP 架構的靈魂。
- 它強制我們思考 關注點分離。
- 它提升了程式碼的 可重用性。
- 它是邁向 微服務架構 的基石 (微服務本質上就是獨立部署的模組)。
至此,我們已經完成了 第五部:進階架構。您已經具備了設計大型、可擴展系統的能力。 接下來的 第六部:企業級功能與品質保證,我們將探討多租戶、測試與 DevOps,這些都是讓系統從 "能跑" 到 "好用且穩定" 的關鍵。
參考資源: