公司项目从Abp5.0.1升级到Abp7.4.2
背景
Abp5.0.1使用的基础框架是.net 6, 现在.net 8正式版已经发布。 abp .net 8版本也即将发布,避免直接从.net 6跨度到.net 8 项目中变更的因数过多难以升级。再加上以前在其他项目中顺利升级到abp 7版本。故在时间允许的情况下,将Abp5.0.1升级到abp7.4.2版本(该版本使用的是.net 7),待abp .net 8版本稳定可靠后再评估是否升级到.net 8版本。
好处与挑战
好处:
1.享受升级框架所带来的优势,包括降低内存消耗和性能提升,以及享受.NET版本升级所带来的红利。
2.获取新的语言特性和框架升级后的新特性支持已经性能提升。
3.保持团队技术的领先地位,避免陷入技术滞后,确保始终保持技术的前瞻性。
挑战:
1.需要对框架升级变更有充分的了解,并对框架升级之后代来的兼容性问题进行及时调整。
2.由于是基础框架的升级,需要对所有功能进行通测,以保证升级之后系统的稳定。
升级过程
1.abp基础框架升级。
ABP CLI 提供了一个方便的命令,可以使用单个命令更新解决方案中所有与 ABP 相关的 NuGet 和 NPM 包:
abp update
指定版本升级
abp update -v 7.4.2
升级整个指定解决方案
abp update -sn cl.cws.sln
当前稳定版最新版本7.4.2 所以直接abp update 就可以。
更多升级细节可参考 升级 ABP 框架
重大变更细节可参考 ABP Version 7.0 Migration Guide
更多版本变更 参考 [Migration Guides/Index | Documentation Center | ABP.IO](https://docs.abp.io/zh-Hans/abp/8.0/Migration-Guides/Index) |
2.兼容性问题调整。
2.1.Json配置调整 abp 7.0 中AbpJsonOptions去除了UseHybridSerializer 的配置,abp 7之后需要使用NewtonsoftJson需要在MvcBuilder中配置。
XXModuleHttpApiModule 中 注释掉options.UseHybridSerializer = false;
//使用NewtonsoftJson作为json解析库
PreConfigure<AbpJsonOptions>(options =>
{
//options.UseHybridSerializer = false;
});
在MvcBuilder中新增NewtonsoftJson 配置
//使用NewtonsoftJson作为json解析库
PreConfigure<IMvcBuilder>(mvcBuilder =>
{
//配置NewtonsoftJson
mvcBuilder.AddNewtonsoftJson(
options =>
{
//忽略循环引用
options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
options.SerializerSettings.ContractResolver = new ConverterContractResolver();
});
});
升级过后出现的问题以及解决办法
1.mapper 映射问题。
某类型中某属性只有Get属性并且返回的是List,原行为是不会映射也不会抛错,新行为会抛出映射错误。
解决办法:
1.只有Get属性且返回引用类型的需要配置忽略。
如:
public class WarehouseLogisticsesFeeBaseInfoDto : LogisticsesFeeBaseInfoDto
{
//public override List<TransportCharacteristics> TransportCharacteristicsList { get; }
public override List<TransportCharacteristics> TransportCharacteristicsList { get { return base.TransportCharacteristicsList; } }
}
配置忽略
public class WarehouseModuleApplicationAutoMapperProfile : Profile
{
public WarehouseModuleApplicationAutoMapperProfile()
{
CreateMap<LogisticsesFeeBaseInfoDto, WarehouseLogisticsesFeeBaseInfoDto>(MemberList.None)
.Ignore(p => p.TransportCharacteristicsList);
}
}
2.需要映射的字段 保留get;set;两个属性,保证能正常映射。
2.扩展字段 必填问题。
Volo.Abp.Domain.Entities 中 聚合根对象有两个特殊属性 ConcurrencyStamp,ExtraProperties,原行为两个字段可以为null,新行为两个值都不能为null,为null时查询会抛出错误。 该问题主要出现在自己写sql添加实体时,框架本身会赋值两个属性,基于框架的实体新增本身不会出现该问题。
解决办法:
修复手动写sql添加实体时对该ConcurrencyStamp,ExtraProperties的赋值。
对已有ConcurrencyStamp,ExtraProperties 为null的数据进行修复。