ABP框架6.x迁移到7.0指南

本文记录的是 ABP 6.x 迁移到 7.0 时的主要变化。由于 ABP 与 .NET 版本持续演进,实际升级项目时,请以当前官方迁移文档为准。

ABP框架7.0版本

ABP 框架 7.0 新增内容

  • 升级到 .NET 7.0
  • 升级到 OpenIddict 4.0
  • Dapr 集成
  • 集成服务
  • 动态权限和动态特性
  • 外部本地化基础设施
  • 分布式实体缓存服务
  • Blazor UI 的布局钩子
  • eShopOnAbp 项目改进

ABP 框架 6.x 迁移到 7.0 指南

ABP Framework 已升级到 .NET 7.0。如果要使用 ABP 7.0,也需要先将解决方案迁移到 .NET 7.0。

FormTenantResolveContributor 已从 AbpTenantResolveOptions 中移除

FormTenantResolveContributor 已从 AbpTenantResolveOptions 中移除。如果仍需要从 HTTP Request Form 中获取租户信息,请添加自定义的 TenantResolveContributor 来实现。

IHybridServiceScopeFactory 已移除

IHybridServiceScopeFactory 已被移除,请改用 IServiceScopeFactory

Hybrid JSON 已移除

由于 System.Text.Json 在 .NET 7 中已经支持更多自定义能力,ABP 不再需要 Hybrid JSON 功能。

旧行为

过去,Volo.Abp.Json 包中包含 AbpJsonModule 模块,System.Text.JsonNewtonsoft 的序列化/反序列化能力都在这个模块中实现。

默认优先使用 System.Text.Json。对于更多自定义场景,可以通过配置 AbpSystemTextJsonSerializerOptionsUnsupportedTypes,交给 Newtonsoft 处理。

新行为

现在,ABP 将 Volo.Abp.Json.SystemTextJsonVolo.Abp.Json.Newtonsoft 拆分成了独立包。这意味着项目中只能选择其中一种实现,默认使用 SystemTextJson。如果需要使用 Newtonsoft,还需要在 Web 项目中引用 Volo.Abp.AspNetCore.Mvc.NewtonsoftJson

  • Volo.Abp.Json.Abstractions
  • Volo.Abp.Json.Newtonsoft
  • Volo.Abp.Json.SystemTextJson
  • Volo.Abp.Json (Depends on Volo.Abp.Json.SystemTextJson by default to prevent breaking)
  • Volo.Abp.AspNetCore.Mvc.NewtonsoftJson

现在 AbpJsonOptions 只保留两个属性:

  • InputDateTimeFormats(List<string>):输入 JSON 日期格式。空字符串表示使用默认格式,也可以提供多个格式用于解析日期。
  • OutputDateTimeFormat(string):输出 JSON 日期格式。null 或空字符串表示使用默认格式。

请移除所有 UnsupportedTypes 配置,并通过自定义 Modifiers 控制序列化/反序列化行为。

更多信息请参考文档:https://github.com/abpframework/abp/blob/dev/docs/en/JSON.md#configuration

如何自定义 JSON 契约,请参考:https://learn.microsoft.com/en-us/dotnet/standard/serialization/system-text-json/custom-contracts

“Manage Host Features” 已移动到 Settings 页面

“Manage Host Features” 按钮已从 Tenants 页面移动到 Settings 页面。

更多信息请参阅:https://github.com/abpframework/abp/pull/13359

Auditing 接口中的 setter 已移除

AuditedEntity 以及其他基础实体类仍会保留公共 setter。如果希望将它们改为私有 setter,请不要继承这些基础类,而是自行实现对应接口。

更多信息请参阅:https://github.com/abpframework/abp/issues/12229#issuecomment-1191384798

DbProperties 类增加 Abp 前缀

请同步更新数据库迁移以及相关连接字符串名称。

EntityCreatingEventDataEntityUpdatingEventDataEntityDeletingEventDataEntityChangingEventData 已移除

这些类型已经废弃,请不要继续使用。

LayoutHook 相关类已移动命名空间

LayoutHookInfo.csLayoutHookViewModel.csLayoutHooks.csAbpLayoutHookOptions.cs 等类已移动到 Volo.Abp.Ui.LayoutHooks 命名空间下。

更多信息请参阅:https://github.com/abpframework/abp/pull/13903

abp.auth.policies 已移除

abp.auth.polices 已移除,请改用 abp.auth.grantedPolicies

静态 C# 代理生成

abp generate-proxy -t csharp .. 命令会在客户端生成所有 classes/enums/other types,其中也包括应用服务接口。

如果已经引用了目标 contracts 包,可以传入 --without-contracts 参数,缩写为 -c

更多信息请参阅:https://github.com/abpframework/abp/issues/13613#issue-1333088953

动态权限

  • IPermissionDefinitionManager 的方法已改为异步方法,并增加 Async 后缀。
  • 权限组中移除了 MultiTenancySides
  • MultiTenancySides 枚举改为继承 byte,此前默认是 int
  • 需要为 Permission Management 模块中的新实体添加迁移。

更多信息请参阅:https://github.com/abpframework/abp/pull/13644

外部本地化基础设施

  • 新增 LocalizationResourceBase,作为本地化资源的基类。LocalizationResource 继承自它,用于类型化(静态)本地化资源;同时新增 NonTypedLocalizationResource,也继承自 LocalizationResourceBase,用于动态/外部本地化资源。以前使用 LocalizationResource 的多数位置现在会改用 LocalizationResourceBase,这可能会对部分应用造成破坏性变更。
  • 所有 MVC UI 主题的布局都应在 ApplicationConfigurationString 行之前添加下面这一行:
1
<script src="~/Abp/ApplicationLocalizationScript?cultureName=@CultureInfo.CurrentUICulture.Name"></script>

ABP 官方主题中已经完成了该修改。

更多信息请参阅:https://github.com/abpframework/abp/pull/13845

BlogPostPublicDto 已替换为 BlogPostCommonDto

  • 在 CMS Kit 模块中,BlogPostPublicDto 已从 Volo.CmsKit.Public.Application.Contracts 移动到 Volo.CmsKit.Common.Application.Contracts,并重命名为 BlogPostCommonDto
  • 更多信息请参阅 PR#13499

如果没有使用 CMS Kit 模块,可以忽略这一项。

Devart.Data.Oracle.EFCore

Devart.Data.Oracle.EFCore 包当时尚未支持 EF Core 7.0。如果使用 AbpEntityFrameworkCoreOracleDevartModule(Volo.Abp.EntityFrameworkCore.Oracle.Devart),可能无法按预期工作。ABP 团队会在依赖更新后尽快发布新的包。

更多信息请参阅:https://github.com/abpframework/abp/issues/14412

Angular 应用变更

新增 @abp/ng.oauth

OAuth 功能已移动到名为 @abp/ng.oauth 的独立包中,因此需要在 app.module.ts 中添加 @abp/ng.oauth。先将新的 npm 包添加到应用中:

1
2
yarn add @abp/ng.oauth
// or npm i ---save @abp/ng.oauth
1
2
3
4
5
6
7
8
9
10
11
12
13
// app.module.ts
import { AbpOAuthModule } from "@abp/ng.oauth";
// ...
@NgModule({
// ...
imports: [
AbpOAuthModule.forRoot(), // <-- Add This
// ...
],
// ...
})
export class AppModule {}

Lepton X Google Fonts

如果使用带有 Google Fonts 的 LeptonX,相关字体此前内置在 Lepton 文件中,现在已经移动到单独文件。因此需要在 angular.json 中添加 font-bundle,位置为 yourProjectName > architect > build > options > styles

// for LeptonX Lite

1
2
3
4
5
6
7
8
9
10
{
input: 'node_modules/@volo/ngx-lepton-x.lite/assets/css/font-bundle.rtl.css',
inject: false,
bundleName: 'font-bundle.rtl',
},
{
input: 'node_modules/@volo/ngx-lepton-x.lite/assets/css/font-bundle.css',
inject: false,
bundleName: 'font-bundle',
},

// for LeptonX

1
2
3
4
5
6
7
8
9
10
{
input: 'node_modules/@volosoft/ngx-lepton-x/assets/css/font-bundle.css',
inject: false,
bundleName: 'font-bundle',
},
{
input: 'node_modules/@volosoft/ngx-lepton-x/assets/css/font-bundle.rtl.css',
inject: false,
bundleName: 'font-bundle.rtl',
},

侧边菜单布局更新

在侧边菜单布局中,eThemeLeptonXComponents.Navbar 已改为 eThemeLeptonXComponents.ToolbareThemeLeptonXComponents.Sidebar 已改为 eThemeLeptonXComponents.Navbar

此外,还新增了 Logo Component、Language Component 等可替换组件。

如果正在使用可替换组件系统,可以查看文档

ng-zorro-antd-tree.css

如果使用 AbpTree 组件或 ABP Commercial,需要在 angular.json 中添加 ng-zorro-antd-tree.css。添加位置同样是 yourProjectName > architect > build > options > styles

{ “input”: “node_modules/ng-zorro-antd/tree/style/index.min.css”, “inject”: false, “bundleName”: “ng-zorro-antd-tree” },

参考资料

文章作者: Ender
文章链接: https://www.fengyeju.net/archives/abp-framework-6-x-to-7-0-migration-guide
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 枫叶居