ABP框架 v3.0 已发布!

我们很高兴地宣布,ABP框架和ABP商业版3.0版已经发布.与常规的2周发布一个版本不同的是, 这个版本用了4周的时间.关闭了119个issue,合并了89个pull request 和主框架仓库中的798次提交.

由于这是一个主要版本,它也包括了一些重大更改.不要害怕,这些变化都容易对应,并且下面会详细解释.

详细更改日志请查看GitHub的发布说明.

ABP框架3.0有哪些新增内容?

这篇文章将只包括重要功能/更改.你可在GitHub的发布说明上看到所有的更改.

Angular 10!

Angular 10刚刚发布,我们就立即迁移了启动模板到Angular 10!所以,当你以Angular UI创建一个新的解决方案时, 你将获得新Angular的优点.

我们为想要迁移到Angular 10的老版本项目准备了一份迁移指南.

Oracle集成包

之前我们为使用Devart库, 基于EF Core for Oracle的应用程序创建了一个集成包, 因为官方的Oracle EF Core包还未支持EF Core 3.1. 现在它以beta发布.虽然是beta版,但我们已经创建了它的集成包,这样你就可以在你的应用程序中使用它.

更多细节请查看文档.

Azure BLOB存储提供器

在上一个版本中我们创建了一个Blob存储系统, 包含一个文件系统和数据库存储提供器. 本次发布我们引入了Azure BLOB存储提供器.请查看文档.

分布式缓存批量操作和新的Redis缓存包

ASP.NET Core的标准IDistributeCache接口不包含批量操作,如使用单独方法/服务器调用设置多个项目. ABP框架引入了新的方法可用于在ABP的IDistributedCache<T>接口中进行批量操作:

GetManyAsync / GetMany
SetManyAsync / SetMany

然后,我们需要为Redis缓存实现这些新方法并且必须创建一个Redis集成包用于扩展微软的实现.

这些方法也被ABP框架所使用, 用来缓存某个用户/角色/租户的设置,功能和权限,并且带来了显著的性能提升.

更多细节请查看缓存文档.

为虚拟文件系统支持嵌入文件清单

虚拟文件系统现在支持在项目中使用GenerateEmbeddedFilesManifest来添加编译程序集中嵌入资源的真实的文件/目录结构.所以,你现在可以访问文件,而没有任何文件名的限制(以前,目录名称中的一些特殊字符,比如.在某些情况会有问题)

查看文档学习如何利用新系统的优点.

新示例

基于社区的需求,我们准备了两个新的示例应用程序:

  • StoredProcedureDemo演示了如何在自定义仓储库中调用存储过程,视图和函数.

  • OrganizationUnitSample演示了如何为你的实体使用Identity模块的组织单元系统.

DynamicStringLength 和 DynamicMaxLength 属性

当类被用作模型或DTO时, 标准的StringLengthMaxLength数据注解属性用来验证类中的属性是很有用的. 但是, 就像任何其它的属性一样, 长度的值应该是一个编译时已知的字面值(常量).

示例: 使用StringLength

public class CreateBookDto
{public const int MaxNameLength = 128; //常量![StringLength(MaxNameLength)]public string Name { get; set; }
}

ABP框架现在有DynamicStringLength 和 DynamicMaxLength属性允许在运行时确定长度.

示例: 使用DynamicStringLength

public class CreateBookDto
{public static int MaxNameLength { get; set; } = 128;[DynamicStringLength(typeof(CreateBookDto), nameof(MaxNameLength))]public string Name { get; set; }
}

DynamicStringLength通过类的类型和这个类的一个静态属性的名字来读取最大长度(也有一个最小长度的选项, 就像StringLength).

这样就允许你从配置中读取最大值并且在应用程序启动时设置(一般在模块的PreConfigureServices方法)

CreateBookDto.MaxNameLength = 200;

预建应用程序模块使用了这个功能,所以你现在可以覆盖这些模块中定义的属性的最大长度了.

自动分布式事件

ABP可以为所有的实体在创建,更新和删除时自动发布分布式事件. 这很有用因为在分布式系统中你通常会对这些基础事件感兴趣.

这个功能在v3.0中已成熟并文档化了. 你可以轻松地配置一部分或全部要发布事件的实体.

IAsyncQueryableExecuter

使用LINQ扩展方法,当你在查询时需要调用ToListAsync(),FirstOrDefaultAsync()... 不幸的是,这些方法并不是标准的LINQ扩展方法.它们定义在Microsoft.EntityFrameworkCore包中(或在MongoDB.Driver,如果你使用MongoDB的话).

所以,如果你想使用异步扩展方法, 你需要依赖这个包.这样做破坏了分层,并且使你的应用程序或领域层依赖于EF Core / MongoDB的包.

IAsyncQueryableExecuter是ABP框架定义的服务, 用来不依赖特定提供器地执行异步查询(EF Core / MongoDB包).

查看文档来获取细节和了解我们的建议.

API 文档

现在我们为每次发布ABP框架和模块都公开API文档.所以,你可以更容易地查看ABP框架的类.点击文档导航菜单中的API文档的链接.

包列表

我们创建了一个页面列出所有ABP相关的官方NuGet和NPM包.

其他

  • 为Identity Server实现了前端通道的服务端客户登出

  • abp.currentUser(Angular UI中的CurrentUser服务)现在有一个包含当前用户的角色名的roles数组.

  • 升级所有的NuGet和NPM软件包的依赖.

  • 引入了ReadOnlyAppService基类(只包含get操作), 做为CrudAppService基类(其中有get,create,update和delete操作)的补充.

其他更新请查看GitHub发行说明.

ABP商业版3.0有哪些新增内容?

除了所有ABP框架的功能以外,ABP商业版同样在本次发布中有一些额外的功能.本节介绍3.0版本中ABP商业版的亮点.

新的文件管理模块

我们创建了一个用于在应用程序中存储和管理文件的新模块.这个新模块基于BLOB存储系统,因此它可以使用不同的存储提供器来存储文件内容.

示例截图

您可以上传,下载和以分层文件夹结构组织文件.它也兼容多租户,你可以为租户限制总文件大小.在未来的版本中,我们将致力于“共享”系统, 用于以一个更可控的方式在用户之间或通过公开链接与你的客户共享文件.

文件管理模块是目前仅适用于MVC / Razor Pages UI.我们正工作于Angular UI,它会在未来的版本中发布.

重大更改

由于这是一个主要版本,我们重新设计了一些API,并引入了一些"容易解决"的重大更改.

ABP框架

  • 更改了一些预建应用程序模块的常量为静态属性, 这样你就可在你的代码中对它们修改. 如果你在属性中使用了这些常量,那么请使用上面介绍的DynamicStringLength.

  • 更改ConcurrencyStamp最大长度为40. 你需要在更新ABP框架后添加一个数据库迁移并且更新数据库.

  • NPM软件包的依赖关系使用~代替^,为了更加稳定.

ABP商业版

  • 更改了应用程序标识的文件名.此前,它为每个主题使用了单独的标识文件,如theme1.png,theme1-reverse.png,theme2.png,theme2-reverse.png(...6).现在,我们只有两个标识文件:logo-light.pnglogo-dark.png.所以,重命名MVC UI的wwwroot/images/logo/和Angular UI的/src/assets/images/logo/下的标识.

  • 我们也增加了ABP商业版的API文档.

此外,Angular UI请查看迁移指南.

关于未来的版本

我们将继续在每两个星期发布一个新的小功能版本.所以,下一个预计发布日期是2020年7月16日的3.1版本.

在接下来的几个版本中,我们将专注于Blazor UI,如路线图中承诺的.我们将继续改进文档,创建示例,添加其他新功能和改善.关注ABP框架Twitter账号获取最新消息...

彩蛋: 文章!

除了开发我们的产品,我们的团队一直在不断书写各种主题的文章/教程.你可能感兴趣的最新文章:

  • Angular 10有哪些新增内容?

  • 在分布式架构中使用ABP, SignalR和RabbitMQ构建实时消息系统

  • 如何在Angular模板中使用Attribute Directives来避免重复

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/308945.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++实现dijkstra单源最短路径

代码如下: #include <iostream> using namespace std; const int N 30; typedef char ElemType; const double noEdge 99999;class Graph { private:double G[N][N];int vertexN, edgeN;double dist[N];bool vis[N];int path[N];int sv;ElemType data[N];int findMinD…

hash table(完全散列实现的哈希表)

hash table(完全散列实现的哈希表) 完全散列 特点&#xff1a;静态的&#xff0c;创建时候完成了散列表的生成。 不可以删&#xff0c;也不可以增加数据。只可以修改数据。 内部用全域散列生成 #ifndef C11LEARN_HASHPERFECT_H #define C11LEARN_HASHPERFECT_H #include &quo…

WPF 框架全构建环境虚拟机硬盘分享

现在 WPF 完全开源了&#xff0c;咱可以构建自己私有的版本。我分享一个虚拟机硬盘给你&#xff0c;只要你下载下来&#xff0c;通过 VMWare 导入&#xff0c;即可无需任何配置&#xff0c;拿到一个能构建 WPF 官方源代码的全构建环境。可以用来只做你的定制版的 WPF 框架现在 …

C++从vector中删除指定元素

①只删除一个元素 vector<int> num;for(vector<int>::iterator iternum.begin();iter!num.end();iter){ //从vector中删除指定的某一个元素 if(*iterk){num.erase(iter);break;} }②删除指定的多个重复元素 erase函数的返回的是指向被删除元素的下一个元素…

二叉树的遍历(算法导论第三版12.1-4)(包含先序遍历,后序遍历和中序遍历)

二叉树的遍历(算法导论第三版12.1-4) 1⃣️先序遍历 template<typename T> void preorder_tree_wald(BinaryTreeNode<T> *node) {if(node! nullptr){std::cout<<node->key<<" ";preorder_tree_wald(node->left);preorder_tree_wald(…

基于.NetCore3.1搭建项目系列 —— 使用Swagger做Api文档 (下篇)

前言回顾上一篇文章《使用Swagger做Api文档 》&#xff0c;文中介绍了在.net core 3.1中&#xff0c;利用Swagger轻量级框架&#xff0c;如何引入程序包&#xff0c;配置服务&#xff0c;注册中间件&#xff0c;一步一步的实现&#xff0c;最终实现生产自动生产API接口说明文档…

C++ vector容器中常见的三种遍历方式

1.迭代器 for (std::vector<int>::iterator it vecTest.begin(); it ! vecTest.end(); it){tempNum *it;}2.C11 新增关键字auto for (auto it : vecTest){tempNum it;}3.对C念念不舍的童鞋们习惯的数组写法 for (size_t i 0; i < maxCount; i){tempNum vecTest[i…

二叉树的中序遍历非递归方法(算法导论第三版12.1-3)

二叉树的中序遍历非递归方法&#xff08;算法导论第三版12.1-3&#xff09; 1⃣️用栈实现 template<typename T> void inorder_tree_walk_non_recursion_by_stack(BinaryTreeNode<T> *node) {Stack<BinaryTreeNode<T>*> stack;stack.push(node);whi…

C++ vector容器中用erase函数和迭代器删除重复元素问题分析

第一种写法&#xff1a; #include <iostream> #include <vector> using namespace std;int main() {vector<int>v;v.push_back(888);v.push_back(89);v.push_back(89);v.push_back(89);v.push_back(9999);v.push_back(89);for (std::vector<int>::ite…

基于.NetCore3.1搭建项目系列 —— 使用Swagger做Api文档(上篇)

前言为什么在开发中&#xff0c;接口文档越来越成为前后端开发人员沟通的枢纽呢&#xff1f;随着业务的发张&#xff0c;项目越来越多&#xff0c;而对于支撑整个项目架构体系而言&#xff0c;我们对系统业务的水平拆分&#xff0c;垂直分层&#xff0c;让业务系统更加清晰&…

写出TREE-MINIMUM 和TREE-MAXIMUM的递归版本(算法导论第三版12.2-2)

写出TREE-MINIMUM 和TREE-MAXIMUM的递归版本&#xff08;算法导论第三版12.2-2&#xff09; template<typename T> BinaryTreeNode<T>* tree_minimum_recursion(BinaryTreeNode<T>* node) {if(node nullptr) return node;if(node->left ! nullptr)retur…

数据结构-树:根节点、子节点、叶子节点是什么?

前言&#xff1a;这个属于数据结构&#xff1a;树。 下面给个例子图解释&#xff08;根节点、子节点、叶子节点&#xff09;。 上图数字 1、3、7是叶子节点&#xff1b;&#xff08;因为他们下面没有分叉出子节点&#xff0c;所以称为&#xff1a;叶子节点&#xff09;【度为0】…

使用kibana可视化报表实时监控你的应用程序

先结果导向&#xff0c;来看我在kibana dashborad中制作的几张监控图。一&#xff1a;先睹为快1. dashboard1监控几个维度的日志&#xff0c;这么点日志量是因为把无用的清理掉了&#xff0c;而且只接入了部分应用。每日日志总数。每日日志错误数&#xff0c;从log4net中levelE…

写出TREE-PREDECESSOR的伪代码(算法导论第三版12.2-3)

写出TREE-PREDECESSOR的伪代码&#xff08;算法导论第三版12.2-3&#xff09; TREE-PREDECESSOR(x)if x.left ! NILreturn TREE-MAXIMUM(x.left)y x.pwhile y ! NIL and x y.leftx yy y.preturn y下面是c代码 template<typename T> BinaryTreeNode<T>* tree_…

[EDA]Quartus II 实验简答题

1&#xff0e;使用 Quartus 编辑波形文件时&#xff0c;界面如下图所示&#xff0c;图中用方框标注的区域&#xff0c;名称是什么&#xff1f;在图中&#xff0c;A、B是输入端口&#xff0c;S是输出端口&#xff0c;要编辑的是哪些信号&#xff1f;为什么。 1&#xff0e;方框标…

基于.NetCore3.1搭建项目系列 —— 使用Swagger导出文档 (补充篇)

前言在上一篇导出文档番外篇中&#xff0c;我们已经熟悉了怎样根据json数据导出word的文档&#xff0c;生成接口文档&#xff0c;而在这一篇&#xff0c;将对上一篇进行完善补充&#xff0c;增加多种导出方式&#xff0c;实现更加完善的导出功能。回顾1. 获取Swagger接口文档的…

[EDA]FPGA/CPLD 设计流程步骤及步骤概念

EDA&#xff08;以 FPGA/CPLD 设计为例&#xff09;流程步骤 1.设计输入 2.全程编译 3.仿真验证 4.编程下载 5.硬件测试 设计输入 原理图/HDL文本编辑或其他输入方式把电路系统输入到EDA平台中。 综合编译 EDA综合器把设计输入描述的电路系统从高层级转换为低层级的电路网表&am…

[EDA] 给出一个双进程状态机,请把它改为单进程状态机。

给出一个双进程状态机&#xff0c;请把它改为单进程状态机。 解答&#xff1a;

给出TREE_INSERT过程的非递归版本(算法导论第三版12.3-1)

给出TREE_INSERT过程的非递归版本&#xff08;算法导论第三版12.3-1&#xff09; template<typename T> void insert_recursive(BinaryTree<T>& tree,BinaryTreeNode<T>* root, BinaryTreeNode<T>* node) {if(tree.root nullptr){tree.root nod…

[EDA] 给出一个状态机,请把它的组合进程分为2个,分别命名为COM1和COM2,其中:COM1实现对外的控制信号输出,COM2实现状态译码。

给出一个状态机&#xff0c;请把它的组合进程分为2个&#xff0c;分别命名为COM1和COM2&#xff0c;其中&#xff1a;COM1实现对外的控制信号输出&#xff0c;COM2实现状态译码。 解答&#xff1a;