.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
,使用框架權限系統。
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
,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愛好者提供學習交流家園!