ABP Framework 5.0 RC.1 新特性和變更說明

iEricLee發表於2021-11-18

.Net 6.0 釋出之後,ABP Framework 也在第一時間進行了升級,並在一個多星期後(2021-11-16)釋出了 5.0 RC.1 ,新功能和重要變更基本已經確定。

5.0版本新特性

新特性列表:

  • 靜態 C# 和 JavaScript 客戶端代理 【重要特性】
  • 分散式事件匯流排支援事務收件箱&發件箱模式 【重要特性】
  • 在事務中釋出事件
  • 禁用使用者
  • 租戶郵箱設定
  • 儀表板授權控制
  • AbpControllerBase 基類
  • 自動設定新實體 TenantId 屬性值

靜態(生成) C# 和 JavaScript 客戶端代理

動態 C# 和 JavaScript 客戶端代理是ABP框架最受歡迎的特性之一。動態代理在執行時生成代理程式碼,並使客戶端到服務端的呼叫變得簡單。在 ABP Framework 5.0 中,提供了另一種方法:可以在開發時生成客戶端代理程式碼。

靜態代理的優點:

  • 效能提升,因為不需要在執行時獲取 HTTP API 定義資訊。
  • 專案解耦,以微服務架構為例,API 閘道器應用直接使用靜態代理,所以不需要在專案中新增對應的微服務 HTTP API 層的引用。動態代理方式,需要先從 API 閘道器返回一個 HTTP API 定義組合,所以需要在閘道器新增微服務 HTTP API層的引用。

靜態代理的缺點:當 API 終結點定義發生改變時,需要重新生成客戶端代理程式碼。

至於使用哪種代理方式,需要結合專案實際情況進行選擇。是的,軟體開發中沒有“完美技術”,總是需要權衡利弊,適合才是最好的。

分散式事件匯流排支援事務收件箱&發件箱模式

這應該是分散式系統開發人員最期待的特性之一。(至此,使用 ABP Framework 開發分散式系統的基礎設施已經完備!)

事務發件箱模式用於在操作應用程式資料庫的同一個事務中釋出分散式事件。

當資料發生變化時,分散式事件被儲存在同一個事務中的資料庫中,然後由一個獨立的後臺工作程式傳送給訊息代理,如RabbitMQ或Kafka,支援失敗重試機制。通過這種方式,確保資料庫狀態和已釋出事件之間的一致性。

事務收件箱模式,確保資料庫狀態已接收事務之間的一致性。首先將接收的事件儲存到資料庫,然後在事務中執行事件處理程式同時從收件箱佇列中移除事件。通過將處理過的訊息保留一段時間,並丟棄從訊息代理接收到的重複事件,確保事件只執行一次。

在應用程式中,啟用收件箱和發件箱模式需要一些手動步驟。可以參看控制檯應用程式示例

在事務中釋出事件

前面介紹的特性(發件箱和收件箱模式)解決分散式系統事務釋出事件問題。事務中釋出事件這一功能,解決在非分散式應用程式釋出事件的同一事務中執行事件處理程式的問題。在 5.0 中,所有事件(本地或分散式)在相同事務中處理。任何處理程式執行失敗,該事務都會回滾。如果不希望觸發回滾,可以使用 try/catch 捕獲並忽略事件處理程式中的異常。

有一點需要清楚的是如果系統中並沒有整合分散式事件提供程式,如 RabbitMQKafka,那麼分散式事件匯流排將在程式內執行,此時就像本地事件一樣。因此,無論系統是分散式或非分散式,所有事件都變成事務性的。

以上處理都是預設進行的。有一個與此更改相關的棄用說明(一些預定義的事件將在下一個主版本中刪除,已經不再需要了)。

禁用使用者

Identity 應用模組新增禁用/啟用使用者功能,對應新增和編輯使用者對話方塊中 Active 核取方塊,禁用操作實現禁止使用者登陸系統而不刪除使用者資料。

image

這項功能在AbpUsers表中新增新欄位,所以需要新增新的資料遷移。

租戶郵箱設定

如果是建立多租戶應用,現在支援為每個租戶單獨進行郵件傳送設定。為了使設定可用,首先需要為租戶設定對應功能許可權:

image

勾選租戶郵件設定許可權:

image

在開發環境,登出,切換到租戶並使用租戶管理員登陸,點選 Administration -> Settings 選單,可以看到郵件設定:

image

儀表板授權控制

ABP可以整合 Hangfire 作為後臺作業工作者,Hangfire 儀表板用於監控和控制後臺作業佇列,參看儀表板截圖:

image

Hangfire儀表板預設無需授權即可訪問,任何使用者可通過 /hangfire URL檢視和控制作業。在 ABP 5.0 版本中,為Hangfire 儀表板新增內建授權過濾器AbpHangfireAuthorizationFilter。使用如下示例程式碼代替 app.UseHangfireDashboard(); 實現:

app.UseHangfireDashboard("/hangfire", new DashboardOptions
{
    AsyncAuthorization = new[] { new AbpHangfireAuthorizationFilter() }
});

新增過濾器之後,只有授權使用者能夠檢視儀表板,當然,建議設定一個許可權名稱,只有擁有該許可權的使用者可以檢視儀表板:

app.UseHangfireDashboard("/hangfire", new DashboardOptions
{
    AsyncAuthorization = new[] {
        new AbpHangfireAuthorizationFilter("MyPermissionName")
    }
});

上面示例將Hangfire 儀表板許可權定義名為 MyPermissionName ,使用框架許可權系統。

AbpControllerBase 基類

ABP 提供 AbpController 類作為 MVC 控制器的繼承基類,在控制器中通過依賴注入提供常用的服務,以此簡化控制器的編寫。在 5.0 版本中,提供第二個控制器基類 AbpControllerBase ,不包含檢視功能,用於建立 API 控制器。在開發 API 控制器,建議使用 AbpControllerBase 代替 AbpController 類。

示例:建立 API 控制器

[Route("api/products")]
public class ProductController : AbpControllerBase
{
    // TODO: ...
}

自動設定新實體 TenantId 屬性值

在 5.0 版本中,當你建立一個新實體物件(實現 IMultiTenant 介面)時,ABP 在 Entity 基類建構函式中自動設定 TenantId ,所有實體和聚合根基類都繼承 Entity 類。TenantId 設定為當前租戶 ICurrentTenant.Id 屬性值。

之前,由開發者為新實體設定 TenantId 值,現在交給 ABP 自動處理,僅在需要設定為其他租戶Id時手動設定。

在極少數情況下,需要注意這個變更,比如:從一個租戶上下文建立 host 端實體,不需要明確地設定 host 實體 TenantId 屬性為 null

主要變更說明

  • 升級到 .Net 6.0
  • 升級到 Bootstrap 5
  • IRepository 不再繼承 IQueryable 介面
  • MVC / Razor Pages UI 移除對 gulp 打包依賴,使用 abp-install-libs 代替。
  • 棄用 EntityCreatingEventData, EntityUpdatingEventData, EntityDeletingEventDataEntityChangingEventData

歡迎加入 ABP Framework 研習社(QQ群:726299208)
專注 ABP Framework 學習,經驗分享、問題討論、示例原始碼、電子書共享!關注 ABP Framework 最新開發進度,後面還會陸續釋出新功能詳解新功能示例等系列文章,敬請關注!
轉載出處:https://www.cnblogs.com/YGYH/p/15571635.html (程式設計悟道)
翻譯原文:ABP.IO Platform 5.0 RC.1 Has Been Released

dotNET兄弟會-公眾號

專注.Net開源技術及跨平臺開發!致力於構建完善的.Net開放技術文庫!為.Net愛好者提供學習交流家園!

image

相關文章