.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 复选框,禁用操作实现禁止用户登陆系统而不删除用户数据。

这项功能在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, 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爱好者提供学习交流家园!

ABP Framework 5.0 RC.1 新特性和变更说明的更多相关文章

  1. ABP Framework 5.2 RC 发布及新增功能介绍

    ABP Framework 5.2 RC 新增功能 目录 ABP Framework 5.2 RC 新增功能 单层解决方案模板 EF Core 数据库迁移 UI 和 数据库 选项 API 版本控制 源 ...

  2. Spring Boot 2.0正式发布,新特性解读

    作者|翟永超 Spring Boot 2.0 来啦,有哪些新特性?升级吗? 写在前面 北京时间 3 月 1 日,经过漫长的等待之后,Spring Boot 2.0 正式发布.作为 Spring 生态中 ...

  3. C# 6.0可能的新特性及C#发展历程

    据扯,C# 6.0在不远的将来就发布了,对应的IDE可能是VS 2014(.Net Framework 5.0),因为VS 2013已于2013年10月份发布了,对应的是.Net Franework ...

  4. NET Framework 4.5 五个新特性

    .NET Framework 4.5 五个新特性 Framework 4.5 已经开发了几个项目了,想去研究一下VS 2015 里面的跨平台..不过好像4.5内核新特性还没搞明白呢还是先看看4.5内核 ...

  5. Atitit.c# .net 3.5 4.0 4.5 5.0 6.0各个版本新特性战略规划总结

    Atitit.c# .net 3.5 4.0 各个版本新特性战略规划总结 1. --------------.Net Framework版本同CLR版本的关系1 2. paip.----------- ...

  6. c# .net 3.5 4.0 4.5 5.0 6.0各个版本新特性战略规划总结【转载】

    引用:http://blog.csdn.net/attilax/article/details/42014327 c# .net 3.5 4.0 各个版本新特性战略规划总结 1. ---------- ...

  7. 转载——C# 6.0可能的新特性及C#发展历程

    据扯,C# 6.0在不远的将来就发布了,对应的IDE可能是VS 2014(.Net Framework 5.0),因为VS 2013已于2013年10月份发布了,对应的是.Net Franework ...

  8. 有史来最大改变 Android 5.0十大新特性

    有史来最大改变 Android 5.0十大新特性 2014.10.16 14:51:31 来源:腾讯数码作者:腾讯数码 ( 0 条评论 )   距离Android系统上一次重大更新不到一年的时间,谷歌 ...

  9. C# 6.0可能的新特性

    C# 6.0可能的新特性 1.主构造函数(Primary Constructors) 主构造函数给类中的变量赋值 Before public class Point { private int x, ...

随机推荐

  1. 4-让线程睡眠的sleep方法

    让线程睡眠的sleep方法 Thread类有一个静态的sleep方法,当一个执行中的线程调用了Thread的sleep方法,调用线程就会让出指定时间的执行权,也就是在这期间不参与CPU调度,但是该线程 ...

  2. MySQL的详细讲解

    目录 Mysql的架构与历史 MySQL的逻辑架构 更新中---- Mysql的架构与历史 MySQL的逻辑架构 第二层的架构是所有的跨引擎的功能实现的地方,例如:存储,触发器,视图等. 第三层半酣了 ...

  3. FastAPI 学习之路(八)路径参数和数值的校验

    系列文章: FastAPI 学习之路(一)fastapi--高性能web开发框架 FastAPI 学习之路(二) FastAPI 学习之路(三) FastAPI 学习之路(四) FastAPI 学习之 ...

  4. 2020.3.21--ICPC训练联盟周赛Benelux Algorithm Programming Contest 2019

    A Appeal to the Audience 要想使得总和最大,就要使最大值被计算的次数最多.要想某个数被计算的多,就要使得它经过尽量多的节点.于是我们的目标就是找到 k 条从长到短的链,这些链互 ...

  5. websocket方案调研及实践

    目录 webscoket方案调研及实践 一.使用场景 二.方案调研 1.Ajax短轮询 2.long-polling长轮询 3.iframe长连接 4.XHR-streaming 5.Websocke ...

  6. python os.walk处理树状目录结构的文件

    在项目工作中,时常需要用到处理文件的方法,尤其是在windows环境下的树状目录结构 os.walk恰好能完美的处理这种树状目录结构文件,能高效地帮助我们得到我们需要处理的文件 目录结构: Deskt ...

  7. 【数据结构与算法Python版学习笔记】树——利用二叉堆实现优先级队列

    概念 队列有一个重要的变体,叫作优先级队列. 和队列一样,优先级队列从头部移除元素,不过元素的逻辑顺序是由优先级决定的. 优先级最高的元素在最前,优先级最低的元素在最后. 实现优先级队列的经典方法是使 ...

  8. Scrum Meeting 1补充会议

    日期:2021年04月24日 会议主要内容概述: 本次会议于11:30举行,对项目架构做出了重要调整,并根据该调整修改了第1次例会报告中后两日计划完成的工作部分. 一.架构调整 会上讨论了用户模块相关 ...

  9. 替换excel模板中的内容并使用JavaMail发送邮件

    由于在公司工作,常年出差,每天都要以日报的形式向公司汇报当天的工作内容.而日报的内容大体上就只有当天工作的主要内容时变化的,其余的都是不变 的. 而我的电脑刚打开excel有点卡,因此决定使用Java ...

  10. python redis自带门神 lock 方法

    redis 支持的数据结构比较丰富,自制一个锁也很方便,所以极少提到其原生锁的方法.但是在单机版redis的使用时,自带锁的使用还是非常方便的.自己有车还打啥滴滴顺风车是吧,本篇主要介绍redis-p ...