Skip to content

第八章:開源特色與社群服務功能

8.1 引言:開箱即用的生產力

ABP Framework 的核心價值之一,在於它內建了許多現代 Web 應用必備的基礎設施。您不需要尋找第三方套件來處理多語言、Swagger 文件或 API 路由,這些都已經整合好了。

此外,活躍的開源社群 (如 EasyAbp) 提供了大量現成的業務模組,讓您可以像堆積木一樣組裝應用程式。


8.2 多語言系統 (Localization)

ABP 提供了一個靈活且強大的多語言系統,支援從 JSON、XML 或資料庫讀取資源。

1. 定義資源

Domain.Shared 專案中,通常已經有一個預設的資源類別 (如 BookStoreResource)。

csharp
[LocalizationResourceName("BookStore")]
public class BookStoreResource
{
}

2. 建立翻譯檔案

Localization/BookStore 目錄下建立 JSON 檔案:

en.json:

json
{
  "culture": "en",
  "texts": {
    "Menu:Home": "Home",
    "Welcome": "Welcome to the application",
    "BookName": "Book Name"
  }
}

zh-Hant.json:

json
{
  "culture": "zh-Hant",
  "texts": {
    "Menu:Home": "首頁",
    "Welcome": "歡迎來到應用程式",
    "BookName": "書名"
  }
}
{
    var text = _localizer["Welcome"]; // 回傳 "歡迎來到應用程式" (若當前文化是 zh-Hant)
}

}


### 4. 巢狀 JSON 物件支援 (V10 新功能)

ABP V10 支援在 JSON 中使用巢狀物件,讓資源檔結構更清晰:

```json
{
  "culture": "en",
  "texts": {
    "Menu": {
      "Home": "Home",
      "Settings": "Settings"
    },
    "Messages": {
      "Welcome": "Welcome to the application"
    }
  }
}

使用時透過 : 存取:_localizer["Menu:Home"]

在 JavaScript 中: ABP 會自動將翻譯資源暴露給前端。

javascript
var text = abp.localization.localize("Welcome", "BookStore");

8.3 自動 API 控制器 (Auto API Controllers)

這是 ABP 最受歡迎的功能之一。您只需編寫 Application Service,ABP 會自動將其暴露為 REST API。

1. 運作原理

Web (或 HttpApi) 模組的 ConfigureServices 中:

csharp
Configure<AbpAspNetCoreMvcOptions>(options =>
{
    options.ConventionalControllers.Create(typeof(BookStoreApplicationModule).Assembly, opts =>
    {
        opts.RootPath = "book-store"; // URL 前綴
    });
});

2. 路由規則

  • GET: 方法名稱以 GetGetList 開頭。
  • POST: 方法名稱以 Create 開頭。
  • PUT: 方法名稱以 Update 開頭。
  • DELETE: 方法名稱以 Delete 開頭。
  • 其他: 預設為 POST。

例如 BookAppService.GetListAsync 會自動映射為 GET /api/book-store/book

3. 自訂路由

如果您不喜歡預設規則,可以使用標準的 ASP.NET Core Attribute。

csharp
[HttpGet("api/my-books/top-selling")]
public async Task<List<BookDto>> GetTopSellingAsync()
{
    // ...
}

8.4 Swagger UI 整合

ABP 範本預設整合了 Swashbuckle。

  • 自動探索:所有 Auto API Controllers 都會自動顯示在 Swagger 上。
  • 授權整合:點擊右上角的 "Authorize" 按鈕,ABP 支援 OAuth2 / OpenID Connect 流程,讓您可以直接在 Swagger 上登入並測試受保護的 API。

8.5 社群模組整合:EasyAbp

EasyAbp 是 ABP 生態中最大的開源組織。讓我們以 EasyAbp.PrivateMessaging (站內信模組) 為例,演示如何整合社群模組。

步驟 1:安裝 NuGet 套件

Application, Domain, EntityFrameworkCore, Web 等專案中安裝對應的套件。

bash
# 在 Domain 專案
dotnet add package EasyAbp.PrivateMessaging.Domain

# 在 Application 專案
dotnet add package EasyAbp.PrivateMessaging.Application

# 在 Web 專案
dotnet add package EasyAbp.PrivateMessaging.Web

步驟 2:加入模組依賴

在各層的 Module.cs 中加入 [DependsOn]

csharp
[DependsOn(
    typeof(PrivateMessagingDomainModule),
    // ...
)]
public class BookStoreDomainModule : AbpModule { }

步驟 3:執行遷移

社群模組通常有自己的資料表。

bash
dotnet ef migrations add Added_PrivateMessaging
dotnet run --project src/BookStore.DbMigrator

步驟 4:使用功能

現在,您的應用程式已經擁有了完整的站內信功能!

  • API: 查看 Swagger,會多出 PrivateMessaging 相關的 API。
  • UI: 如果安裝了 Web 套件,通常會自動掛載選單項目 (視模組設計而定)。

8.6 習題

概念題(易)⭐

習題 1:ABP 社群版提供的自動 API 生成機制(Auto API Controllers)如何工作?

請說明:

  • 運作原理
  • 路由規則(GET、POST、PUT、DELETE)
  • 如何自訂路由
  • 與傳統 Controller 的差異

習題 2:多語言支援(Localization)在 ABP 中如何實現?舉例說明。

請說明:

  • 資源檔案的組織方式
  • 在 C# 中如何使用
  • 在 JavaScript 中如何使用
  • 動態切換語言的機制

計算/練習題(中)💻

習題 3:實作一個社群模組集成案例:整合 EasyAbp DataDictionary 模組,並在應用中使用。

要求:

  • 安裝模組套件
  • 配置模組依賴
  • 執行資料庫遷移
  • 在應用服務中使用模組功能

習題 4:設計一個快取策略系統,包含本地快取、分散式快取、快取失效機制。

要求:

  • 設計快取層次結構
  • 實作快取失效策略
  • 處理快取穿透問題
  • 提供效能對比數據

案例分析題(較難)📋

習題 5:分析一個真實場景:電商平台的商品查詢系統,需要同時支援海量查詢、分類快速切換、庫存實時更新。設計解決方案。

要求:

  • 設計快取策略
  • 處理資料一致性
  • 優化查詢效能
  • 提供完整的架構設計

習題 6:設計一個 ABP 社群版的實時通知系統,支援使用者通知推送、批量通知、重試機制。

要求:

  • 設計通知系統架構
  • 實作 SignalR 整合
  • 處理離線通知
  • 實作重試機制

習題解答:請參考 content/solutions/ch08-solutions.md


8.7 總結

本章介紹了 ABP 如何透過內建功能與社群生態來加速開發。

  • Localization 讓應用程式走向國際。
  • Auto API 減少了重複的 Controller 程式碼。
  • EasyAbp 提供了豐富的現成功能。

至此,我們已經完成了 第二部:核心架構與基礎設施 的學習。您已經具備了開發標準 ABP 應用程式的能力。

在接下來的 第三部:進階實戰 中,我們將挑戰更複雜的場景,包括 DDD 的深度實作、微服務架構以及效能優化。


參考資源

Released under the MIT License.