ABP Framework 5.0 RC.1 新特性和变更说明
.Net 6.0 發(fā)布之后,ABP Framework 也在第一時(shí)間進(jìn)行了升級(jí),并在一個(gè)多星期后(2021-11-16)發(fā)布了 5.0 RC.1 ,新功能和重要變更基本已經(jīng)確定。
5.0版本新特性
5.0版本新特性列表:
?靜態(tài) C# 和 JavaScript 客戶端代理?分布式事件總線支持事務(wù)收件箱&發(fā)件箱模式?在事務(wù)中發(fā)布事件?禁用用戶?租戶郵箱設(shè)置?儀表板授權(quán)控制?AbpControllerBase 基類?自動(dòng)設(shè)置新實(shí)體 TenantId 屬性值
靜態(tài)(生成) C# 和 JavaScript 客戶端代理
動(dòng)態(tài) C# 和 JavaScript 客戶端代理是ABP框架最受歡迎的特性之一。動(dòng)態(tài)代理在運(yùn)行時(shí)生成代理代碼,并使客戶端到服務(wù)端的調(diào)用變得簡(jiǎn)單。在 ABP Framework 5.0 中,提供了另一種方法:可以在開(kāi)發(fā)時(shí)生成客戶端代理代碼。
靜態(tài)代理的優(yōu)點(diǎn):
?性能提升,因?yàn)椴恍枰谶\(yùn)行時(shí)獲取 HTTP API 定義信息。?項(xiàng)目解耦,以微服務(wù)架構(gòu)為例,API 網(wǎng)關(guān)應(yīng)用直接使用靜態(tài)代理,所以不需要在項(xiàng)目中添加對(duì)應(yīng)的微服務(wù) HTTP API 層的引用。動(dòng)態(tài)代理方式,需要先從 API 網(wǎng)關(guān)返回一個(gè) HTTP API 定義組合,所以需要在網(wǎng)關(guān)添加微服務(wù) HTTP API層的引用。
靜態(tài)代理的缺點(diǎn):當(dāng) API 終結(jié)點(diǎn)定義發(fā)生改變時(shí),需要重新生成客戶端代理代碼。
至于使用哪種代理方式,需要結(jié)合項(xiàng)目實(shí)際情況進(jìn)行選擇。是的,軟件開(kāi)發(fā)中沒(méi)有“完美技術(shù)”,總是需要權(quán)衡利弊,適合才是最好的。
分布式事件總線支持事務(wù)收件箱&發(fā)件箱模式
這應(yīng)該是分布式系統(tǒng)開(kāi)發(fā)人員最期待的特性之一。(至此,使用 ABP Framework 開(kāi)發(fā)分布式系統(tǒng)的基礎(chǔ)設(shè)施已經(jīng)完備!)
事務(wù)發(fā)件箱模式用于在操作應(yīng)用程序數(shù)據(jù)庫(kù)的同一個(gè)事務(wù)中發(fā)布分布式事件。
當(dāng)數(shù)據(jù)發(fā)生變化時(shí),分布式事件被保存在同一個(gè)事務(wù)中的數(shù)據(jù)庫(kù)中,然后由一個(gè)獨(dú)立的后臺(tái)工作進(jìn)程發(fā)送給消息代理,如RabbitMQ或Kafka,支持失敗重試機(jī)制。通過(guò)這種方式,確保數(shù)據(jù)庫(kù)狀態(tài)和已發(fā)布事件之間的一致性。
事務(wù)收件箱模式,確保數(shù)據(jù)庫(kù)狀態(tài)和已接收事務(wù)之間的一致性。首先將接收的事件保存到數(shù)據(jù)庫(kù),然后在事務(wù)中執(zhí)行事件處理程序同時(shí)從收件箱隊(duì)列中移除事件。通過(guò)將處理過(guò)的消息保留一段時(shí)間,并丟棄從消息代理接收到的重復(fù)事件,確保事件只執(zhí)行一次。
在應(yīng)用程序中,啟用收件箱和發(fā)件箱模式需要一些手動(dòng)步驟。可以參看控制臺(tái)應(yīng)用程序示例[1]。
在事務(wù)中發(fā)布事件
前面介紹的特性(發(fā)件箱和收件箱模式)解決分布式系統(tǒng)事務(wù)發(fā)布事件問(wèn)題。事務(wù)中發(fā)布事件這一功能,解決在非分布式應(yīng)用程序發(fā)布事件的同一事務(wù)中執(zhí)行事件處理程序的問(wèn)題。在 5.0 中,所有事件(本地或分布式)在相同事務(wù)中處理。任何處理程序執(zhí)行失敗,該事務(wù)都會(huì)回滾。如果不希望觸發(fā)回滾,可以使用?try/catch?捕獲并忽略事件處理程序中的異常。
有一點(diǎn)需要清楚的是如果系統(tǒng)中并沒(méi)有集成分布式事件提供程序,如?RabbitMQ[2]?、Kafka[3],那么分布式事件總線[4]將在進(jìn)程內(nèi)執(zhí)行,此時(shí)就像本地事件[5]一樣。因此,無(wú)論系統(tǒng)是分布式或非分布式,所有事件都變成事務(wù)性的。
以上處理都是默認(rèn)進(jìn)行的。有一個(gè)與此更改相關(guān)的棄用說(shuō)明[6](一些預(yù)定義的事件[7]將在下一個(gè)主版本中刪除,已經(jīng)不再需要了)。
禁用用戶
Identity 應(yīng)用模塊新增禁用/啟用用戶功能,對(duì)應(yīng)添加和編輯用戶對(duì)話框中?Active?復(fù)選框,禁用操作實(shí)現(xiàn)禁止用戶登陸系統(tǒng)而不刪除用戶數(shù)據(jù)。
這項(xiàng)功能在AbpUsers表中添加新字段,所以需要添加新的數(shù)據(jù)遷移。
租戶郵箱設(shè)置
如果是創(chuàng)建多租戶應(yīng)用,現(xiàn)在支持為每個(gè)租戶單獨(dú)進(jìn)行郵件發(fā)送設(shè)置。為了使設(shè)置可用,首先需要為租戶設(shè)置對(duì)應(yīng)功能權(quán)限:
勾選租戶郵件設(shè)置權(quán)限:
在開(kāi)發(fā)環(huán)境,登出,切換到租戶并使用租戶管理員登陸,點(diǎn)擊 Administration -> Settings 菜單,可以看到郵件設(shè)置:
儀表板授權(quán)控制
ABP可以集成 Hangfire[8]?作為后臺(tái)作業(yè)工作者,Hangfire 儀表板用于監(jiān)控和控制后臺(tái)作業(yè)隊(duì)列,參看儀表板截圖:
Hangfire儀表板默認(rèn)無(wú)需授權(quán)即可訪問(wèn),任何用戶可通過(guò)?/hangfire?URL查看和控制作業(yè)。在 ABP 5.0 版本中,為Hangfire 儀表板添加內(nèi)置授權(quán)過(guò)濾器AbpHangfireAuthorizationFilter。使用如下示例代碼代替?app.UseHangfireDashboard();?實(shí)現(xiàn):
app.UseHangfireDashboard("/hangfire", new DashboardOptions {AsyncAuthorization = new[] { new AbpHangfireAuthorizationFilter() } });添加過(guò)濾器之后,只有授權(quán)用戶能夠查看儀表板,當(dāng)然,建議設(shè)置一個(gè)權(quán)限名稱,只有擁有該權(quán)限的用戶可以查看儀表板:
app.UseHangfireDashboard("/hangfire", new DashboardOptions {AsyncAuthorization = new[] {new AbpHangfireAuthorizationFilter("MyPermissionName")} });上面示例將Hangfire 儀表板權(quán)限定義名為?MyPermissionName?,使用框架權(quán)限系統(tǒng)。
AbpControllerBase 基類
ABP 提供?AbpController?類作為 MVC 控制器的繼承基類,在控制器中通過(guò)依賴注入提供常用的服務(wù),以此簡(jiǎn)化控制器的編寫。在 5.0 版本中,提供第二個(gè)控制器基類?AbpControllerBase?,不包含視圖功能,用于創(chuàng)建 API 控制器。在開(kāi)發(fā) API 控制器,建議使用?AbpControllerBase?代替?AbpController?類。
示例:創(chuàng)建 API 控制器
[Route("api/products")] public class ProductController : AbpControllerBase {// TODO: ... }自動(dòng)設(shè)置新實(shí)體 TenantId 屬性值
在 5.0 版本中,當(dāng)你創(chuàng)建一個(gè)新實(shí)體對(duì)象(實(shí)現(xiàn)?IMultiTenant?接口)時(shí),ABP 在?Entity?基類構(gòu)造函數(shù)中自動(dòng)設(shè)置?TenantId?,所有實(shí)體和聚合根基類都繼承?Entity?類。TenantId?設(shè)置為當(dāng)前租戶?ICurrentTenant.Id?屬性值。
之前,由開(kāi)發(fā)者為新實(shí)體設(shè)置?TenantId?值,現(xiàn)在交給 ABP 自動(dòng)處理,僅在需要設(shè)置為其他租戶Id時(shí)手動(dòng)設(shè)置。
在極少數(shù)情況下,需要注意這個(gè)變更,比如:從一個(gè)租戶上下文創(chuàng)建 host 端實(shí)體,不需要明確地設(shè)置 host 實(shí)體?TenantId?屬性為?null?。
主要變更說(shuō)明
?升級(jí)到?.Net 6.0?升級(jí)到?Bootstrap 5?IRepository?不再繼承?IQueryable?接口??MVC / Razor Pages UI 移除對(duì)?gulp?打包依賴,使用?abp-install-libs?代替。??棄用?EntityCreatingEventData,?EntityUpdatingEventData,?EntityDeletingEventData?和?EntityChangingEventData?。
歡迎加入?ABP Framework 研習(xí)社(QQ群:726299208)?專注 ABP Framework 學(xué)習(xí),經(jīng)驗(yàn)分享、問(wèn)題討論、示例源碼、電子書(shū)共享!關(guān)注 ABP Framework 最新開(kāi)發(fā)進(jìn)度,后面還會(huì)陸續(xù)發(fā)布新功能詳解、新功能示例等系列文章,敬請(qǐng)關(guān)注!轉(zhuǎn)載出處:https://www.cnblogs.com/YGYH/p/15571635.html (編程悟道)翻譯原文:ABP.IO Platform 5.0 RC.1 Has Been Released[9]
dotNET兄弟會(huì)-公眾號(hào)
專注.Net開(kāi)源技術(shù)及跨平臺(tái)開(kāi)發(fā)!致力于構(gòu)建完善的.Net開(kāi)放技術(shù)文庫(kù)!為.Net愛(ài)好者提供學(xué)習(xí)交流家園!
References
[1]?控制臺(tái)應(yīng)用程序示例:?https://github.com/abpframework/abp/tree/dev/test/DistEvents
[2]?RabbitMQ:?https://docs.abp.io/en/abp/latest/Distributed-Event-Bus-RabbitMQ-Integration
[3]?Kafka:?https://docs.abp.io/en/abp/latest/Distributed-Event-Bus-Kafka-Integration
[4]?分布式事件總線:?https://docs.abp.io/en/abp/latest/Distributed-Event-Bus
[5]?本地事件:?https://docs.abp.io/en/abp/latest/Local-Event-Bus
[6]?棄用說(shuō)明:?https://github.com/abpframework/abp/issues/9897
[7]?預(yù)定義的事件:?https://github.com/abpframework/abp/issues/9908
[8]?集成 Hangfire:?https://docs.abp.io/en/abp/5.0/Background-Jobs-Hangfire
[9]?ABP.IO Platform 5.0 RC.1 Has Been Released:?https://github.com/abpframework/abp/blob/dev/docs/en/Blog-Posts/2021-11-18%20v5_0_Preview/POST.md
總結(jié)
以上是生活随笔為你收集整理的ABP Framework 5.0 RC.1 新特性和变更说明的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: .NET 6新特性试用 | 热重载
- 下一篇: 生活在任务栏的猫, CPU使用率越高它就