.Net 6 升 7 的那些事

前言

自己的.net 6项目升级.net 7基本已经搞完,沉淀下来,决定结合git commit上的记录和一些自己遇到的坑,水上一篇,记录一下。

绝大多数的情况

6升7的体验总体来说还是好的,把.csproj中的

<TargetFramework>net6.0</TargetFramework>
改为
<TargetFramework>net7.0</TargetFramework>
再把nuget package update一下就完事了。很多第三方包也是第一时间适配.net 7,比如我自己的Blazor.ECharts,还有盛派的SDK等。

EFCore 7的原生Batch

EFCore 7已经原生支持Batch,于是把一直在用的EFCore.BulkExtensions拿掉。修改也简单,诸如把

await db.Tdplans.Where(t => t.GprsId == d.Key).BatchDeleteAsync(stoppingToken); 
await db.Suppliers.Where(s => s.bizNo == supplier.bizNo).BatchUpdateAsync(new SupplierClass { IsDelete = true });
改为
await db.Tdplans.Where(t => t.GprsId == d.Key).ExecuteDeleteAsync(stoppingToken); 
await db.Suppliers.Where(s => s.bizNo == supplier.bizNo).ExecuteUpdateAsync(s => s.SetProperty(b => b.IsDelete, true));

Blazor

有个地方被标记过时了,顺便改了一下,不改貌似这个版本也不会有影响,看到划线的强迫症行为

private async Task BeginSignOut(MouseEventArgs args) 
{
 await SignOutManager.SetSignOutState();
 Navigation.NavigateTo("authentication/logout"); 
}
to
private void BeginSignOut(MouseEventArgs args) 
{
 Navigation.NavigateToLogout("authentication/logout"); 
}

盛派SDK

有个地方会报错,提示 System.FormatException: The format of value '' is invalid.
当我发现问题,打算提交PR的时候,发现苏总已经修复了,这里要给苏总点个赞 https://github.com/Senparc/Senparc.CO2NET/commit/7d528baba23ad7186b3fd5e45bc7e71d57578f61

Orleans

由于大版本的破坏性修改,这个是升7最麻烦最复杂的。具体需要参考微软的文档:https://learn.microsoft.com/zh-cn/dotnet/orleans/whats-new-in-orleans
我这里只大概提一下我修改的要点。

Orleans Server

启动的时候的 ConfigureApplicationParts 配置已经不需要了,也就是以下代码可以删了

.ConfigureApplicationParts(parts => 
{
parts.AddApplicationPart(typeof(SessionControlGrain).Assembly).WithReferences(); 
})

Orleans Client

ClientBuilder + services.AddSingleton(Client) 已经不用了,提供了一个新的Client的配置注入方法。

.UseOrleansClient((context, client) => {
 client.UseStaticClustering(new IPEndPoint(IPAddress.Parse(context.Configuration.GetSection("Option:OrleansServerIP").Value), 30000))
 .Configure<ClusterOptions>(options => {
 options.ClusterId = "JBBus.Orleans";
 options.ServiceId = "JBBus.Orleans"; 
 });
})
需要注意的是UseOrleansClient必须在ConfigureServices之前,否则Service会拿不到东西
还有一个地方需要注意的是,对于HostedService,不能直接在其构造函数中使用 client.GetGrain (之前基于.net6的orleans 3.6.5是可以这样用的),会提示找不到对象。需要在 StartAsync 里面调用。

Orleans Models

所有涉及数据传输和序列化的类都需要加上 [GenerateSerializer] 标记特性,虽说有宇宙第一IDE的加成,但如果类多的话工作量还是巨大。
VS
需要注意的点:

  1. 基类和子类都需要加,并且ID都从0开始
  2. 如果你和我一样定义的Model也在别的地方使用的话,那么不需要在Orleans中虚拟化的属性需要标记 [field: NonSerialized] ,并且把ID的数字重新理顺
  3. GrainState 的实体类也必须标记
  4. 对于使用了第三方库的类型的属性,标记 ID 使用时会报错的,因为你没法在第三方库的类型里面加 [GenerateSerializer] ,只能暂时先标记 [field: NonSerialized] 改用基本数据类型绕过,或者 等

Orleans Grains

Microsoft.Orleans.CodeGenerator 被 Microsoft.Orleans.Sdk 取代
OnActivateAsync 多了参数 (CancellationToken cancellationToken) ,记得要加上
RegisterOrUpdateReminder 变扩展方法了,记得在前面加上 this.

不允许评论