Skip to content

第十五章:模組化開發 (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 Release

2. 建立 C# Proxy (針對模組)

如果您的模組將被用於微服務環境,您需要確保 HttpApi.Client 專案正確生成了 Proxy。

  • HttpApi.Client 模組中,使用 context.Services.AddHttpClientProxy<IBookAppService>(); 來註冊代理。

15.6 實戰練習

練習 1:建立一個 "評論 (Comment)" 模組

  1. 使用 abp new Volo.Comment -t module 建立模組。
  2. 定義 Comment 實體 (包含 EntityType, EntityId, Content)。這是一個通用的評論模組,可以掛在任何實體上。
  3. 實作 CommentAppService

練習 2:在主應用程式中使用模組

  1. 在現有的 BookStore 應用程式中,加入 Volo.Comment 的專案引用 (或 NuGet 引用)。
  2. BookStore 的各層 Module 中加入 [DependsOn]
  3. 執行 DbMigrator,確保評論模組的資料表被建立。

練習 3:整合功能

  1. 在書籍詳情頁面,呼叫 CommentAppService 顯示該書籍的評論。
  2. 實作 "新增評論" 功能。

15.7 總結

模組化是 ABP 架構的靈魂。

  • 它強制我們思考 關注點分離
  • 它提升了程式碼的 可重用性
  • 它是邁向 微服務架構 的基石 (微服務本質上就是獨立部署的模組)。

至此,我們已經完成了 第五部:進階架構。您已經具備了設計大型、可擴展系統的能力。 接下來的 第六部:企業級功能與品質保證,我們將探討多租戶、測試與 DevOps,這些都是讓系統從 "能跑" 到 "好用且穩定" 的關鍵。


參考資源

Released under the MIT License.