ABP Framework 5.0 RC.1 新特性和變更說明,該版本包括分布式系統開發人員最期待的特性之一:分布式事件總線支援事務收件箱&發件箱模式。
.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
捕獲并忽略事件處理程式中的異常。
有一點需要清楚的是如果系統中并沒有內建分布式事件提供程式,如 RabbitMQ 、Kafka,那麼分布式事件總線将在程序内執行,此時就像本地事件一樣。是以,無論系統是分布式或非分布式,所有事件都變成事務性的。
以上處理都是預設進行的。有一個與此更改相關的棄用說明(一些預定義的事件将在下一個主版本中删除,已經不再需要了)。
Identity 應用子產品新增禁用/啟用使用者功能,對應添加和編輯使用者對話框中 Active 複選框,禁用操作實作禁止使用者登陸系統而不删除使用者資料。
這項功能在
AbpUsers
表中添加新字段,是以需要添加新的資料遷移。
如果是建立多租戶應用,現在支援為每個租戶單獨進行郵件發送設定。為了使設定可用,首先需要為租戶設定對應功能權限:
勾選租戶郵件設定權限:
在開發環境,登出,切換到租戶并使用租戶管理者登陸,點選 Administration -> Settings 菜單,可以看到郵件設定:
ABP可以內建 Hangfire 作為背景作業工作者,Hangfire 儀表闆用于監控和控制背景作業隊列,參看儀表闆截圖:
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
,使用架構權限系統。
ABP 提供
AbpController
類作為 MVC 控制器的繼承基類,在控制器中通過依賴注入提供常用的服務,以此簡化控制器的編寫。在 5.0 版本中,提供第二個控制器基類
AbpControllerBase
,不包含視圖功能,用于建立 API 控制器。在開發 API 控制器,建議使用
AbpControllerBase
代替
AbpController
類。
示例:建立 API 控制器
[Route("api/products")]
public class ProductController : AbpControllerBase
{
// TODO: ...
}
在 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
和EntityDeletingEventData
EntityChangingEventData
歡迎加入 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愛好者提供學習交流家園!
記錄技術修行中的反思與感悟,以碼傳心,以軟制道,知行合一!