Orleans框架升级指南(3.6.5--8.0.0)

news/2025/1/24 17:24:36/文章来源:https://www.cnblogs.com/mooncher/p/18689845

升级指南

官方升级指南
https://learn.microsoft.com/zh-cn/dotnet/orleans/migration-guide?source=recommendations
 
主要涉及以下几个改动点
  1. ConfigureApplicationParts
3.6.5版在Silo初始化的时候,会通过这个方法将指定目录下的Grain加载进来
.ConfigureApplicationParts(parts => parts.AddFromApplicationBaseDirectory())
8.0.0版就不需要了,直接去掉这个方法,因为它有另外新的加载机制,后面会说到
 
  1. JsonGrainStateSerializerOptions
3.6.5版的Grain状态消息Json序列化配置,是在Silo初始化时(比如使用MongoDB作为持久化存储)通过ConfigureJsonSerializerSettings配置的
.AddMongoDBGrainStorage("Default", (MongoDBGrainStorageOptions op) =>
{op.CollectionPrefix = "GrainStorage";op.DatabaseName = configSection.GetValue<string>("DataBase");op.ConfigureJsonSerializerSettings = jsonSettings =>{jsonSettings.NullValueHandling = NullValueHandling.Include;jsonSettings.DefaultValueHandling = DefaultValueHandling.Populate;jsonSettings.ObjectCreationHandling = ObjectCreationHandling.Replace;};})
8.0.0版的Grain状态消息Json序列化配置,是在Silo初始化时通过配置JsonGrainStateSerializerOptions属性
.Configure<JsonGrainStateSerializerOptions>(options => options.ConfigureJsonSerializerSettings =settings =>{settings.NullValueHandling = NullValueHandling.Include;settings.ObjectCreationHandling = ObjectCreationHandling.Replace;settings.DefaultValueHandling = DefaultValueHandling.Populate;})
但仅仅这个还不够,还需要单独实现一个Grain状态的序列化器(因为8.0.3版的Orleans.Providers.MongoDB包有Bug所以才需要这一步,这个Bug已经由我向作者反馈过,详情见https://github.com/OrleansContrib/Orleans.Providers.MongoDB/issues/136,包的作者也修复了,后续新的版本应该不用),如下
public class NewJsonGrainStateSerializer: IGrainStateSerializer
{private readonly JsonSerializerSettings jsonSettings;public NewJsonGrainStateSerializer(IOptions<JsonGrainStateSerializerOptions> options, IServiceProvider serviceProvider){jsonSettings = OrleansJsonSerializerSettings.GetDefaultSerializerSettings(serviceProvider);options.Value.ConfigureJsonSerializerSettings(jsonSettings);}public T Deserialize<T>(BsonValue value){using var jsonReader = new JTokenReader(value.ToJToken());var localSerializer = JsonSerializer.CreateDefault(jsonSettings);return localSerializer.Deserialize<T>(jsonReader);}public BsonValue Serialize<T>(T state){var localSerializer = JsonSerializer.CreateDefault(jsonSettings);return JObject.FromObject(state, localSerializer).ToBson();}
}
并将NewJsonGrainStateSerializer注入到容器替换掉默认的序列化器
.ConfigureServices(services => services.AddSingleton<IGrainStateSerializer,NewJsonGrainStateSerializer>())
 
  1. AddSimpleMessageStreamProvider
3.6.5版中如果你使用了流式订阅,且用的是SimpleMessageStreams(也称为 SMS)
.AddSimpleMessageStreamProvider(ApplicationConsts.MessageStreamName)
8.0.0版中需要将它替换为使用MemoryStream
.AddMemoryStreams(AeFinderApplicationConsts.MessageStreamName)
 
  1. UseOrleansClient
3.6.5版初始化Orleans的客户端,是通过给IClusterClient注册一个ClientBuilder对象,如下:
context.Services.AddSingleton<IClusterClient>(o =>
{return new ClientBuilder().ConfigureDefaults()// .UseRedisClustering(opt =>// {//     opt.ConnectionString = configuration["Orleans:ClusterDbConnection"];//     opt.Database = Convert.ToInt32(configuration["Orleans:ClusterDbNumber"]);// }).UseMongoDBClient(configuration["Orleans:MongoDBClient"]).UseMongoDBClustering(options =>{options.DatabaseName = configuration["Orleans:DataBase"];;options.Strategy = MongoDBMembershipStrategy.SingleDocument;}).Configure<ClusterOptions>(options =>{options.ClusterId = configuration["Orleans:ClusterId"];options.ServiceId = configuration["Orleans:ServiceId"];}).ConfigureApplicationParts(parts =>parts.AddApplicationPart(typeof(GrainsModule).Assembly).WithReferences()).AddSimpleMessageStreamProvider(ApplicationConsts.MessageStreamName).ConfigureLogging(builder => builder.AddProvider(o.GetService<ILoggerProvider>())).Build();
});
8.0.0版就得换一种方式了,它直接提供了UseOrleansClient扩展方法来帮助你实现,如下:
public static IHostBuilder UseOrleansClient(this IHostBuilder hostBuilder)
{return hostBuilder.UseOrleansClient((context, clientBuilder) =>{var configSection = context.Configuration.GetSection("Orleans");if (configSection == null)throw new ArgumentNullException(nameof(configSection), "The Orleans config node is missing");clientBuilder.UseMongoDBClient(configSection.GetValue<string>("MongoDBClient")).UseMongoDBClustering(options =>{options.DatabaseName = configSection.GetValue<string>("DataBase");options.Strategy = MongoDBMembershipStrategy.SingleDocument;}).Configure<ClusterOptions>(options =>{options.ClusterId = configSection.GetValue<string>("ClusterId");options.ServiceId = configSection.GetValue<string>("ServiceId");}).AddMemoryStreams(AeFinderApplicationConsts.MessageStreamName).AddActivityPropagation();});
}
 
  1. GenerateSerializer
3.6.5版的Grain类加载,是通过上面说到的ConfigureApplicationParts方法
8.0.0版不用,它会自动寻找那些引用了Microsoft.Orleans.Sdk包的程序集,找出里面的Grain类自动进行加载到Silo中
除此之外,它还需要你给每个Grain中定义的方法用到的通信类(输入和输出),都标上【GenerateSerializer】和【Id】注解,如下:
[GenerateSerializer]
public class CreateAppDto
{[Id(0)] public string AppId { get; set; }[Id(1)] public string OrganizationId { get; set; }[Id(2)] public string DeployKey { get; set; }[MinLength(2),MaxLength(20)][RegularExpression("[A-Za-z0-9\\s]+" ,ErrorMessage = "The AppName can only contain letters('A'-'Z', 'a'-'z'), numbers(0-9), and spaces(' ').")][Id(3)] public string AppName { get; set; }
}
 
  1. OnActivateAsync
3.6.5版中关于Grain激活和失活过程的重载方法分别是
public override async Task OnActivateAsync()
{await ReadStateAsync();await base.OnActivateAsync();
}public override async Task OnDeactivateAsync()
{await WriteStateAsync();await base.OnDeactivateAsync();
}
8.0.0版中关于Grain激活和失活过程的重载方法分别是
public override async Task OnActivateAsync(CancellationToken cancellationToken)
{await ReadStateAsync();await base.OnActivateAsync(cancellationToken);
}public override async Task OnDeactivateAsync(DeactivationReason reason, CancellationToken cancellationToken)
{await WriteStateAsync();await base.OnDeactivateAsync(reason, cancellationToken);
}
主要是多了一些入参

注意

我这里只是列了一些主要的改动点,实际升级过程中需要注意的其他地方可以参考官方文档。
此博客为作者原创,转载请注明出处,谢谢~

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

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

相关文章

AtCoder Beginner Contest 386

A - Full House 2 题意给\(4\)个整数,问能否添加一个整数使得恰有\(3\)个整数\(a\)和\(2\)个整数\(b\)思路模拟代码点击查看代码 #include <bits/stdc++.h> using namespace std; #define int long long typedef pair<int, int> pii;const int mxn = 1e6 + 5;void…

Iceberg治理服务Amoro---配置Prometheus + Grafana看板

一、基础资料 1、mac安装Prometheus + Grafana https://www.cnblogs.com/robots2/p/18689540 2、配置文档 https://amoro.apache.org/docs/0.7.1/deployment/#configure-metric-reporter 3、Grafana配置内容 https://github.com/apache/amoro/blob/master/grafana/dashboard.js…

【Python】查找两个表格是否存在相同元素

其实就是字典的应用,把其中一个表格做成字典(将需要查询的元素设为字典的键),然后读取另一个表格逐个在字典中查找 表1:表2:import openpyxlwb1 = openpyxl.load_workbook(r"C:\Users\Lenovo\Desktop\表1.xlsx") ws1 = wb1["Sheet1"] wb2 = openpyxl…

git分支提交,提PR

远程分支xxx,临时分支tmp_xxx git checkout -b tmp_xxx   #创建并进入临时分支 git pull origin xxx      #更新本地code git add .          git commit -m "test pr" git push --set-upstream origin tmp_xxx #github上现在能看到这个临时…

Hibernate Validator 国际化开启快速校验配置

这里默认你已经配置好了国际化,如需配置可以参考 网上其他配置,这里只做快速失败国际化配置@Configuration public class ValidConfig {@Beanpublic Validator validator() {     // 这里是读取你的国际化配置文件做缓存MessageInterpolator messageInterpolator = new R…

AQS学习笔记

一、使线程进入等待状态和唤醒状态的三种方法 1、使用Object中的wait()方法让线程等待,使用Object中的notify()方法唤醒线程,需配合synchronized关键字使用 2、使用JUC包中的Condition的await()方法让线程等待,使用signal()方法唤醒线程 3、LockSupport类可以阻塞当前线程以…

Oracle安装指南 Xming远程桌面

安装Xming然后使用Oracle用户连接登录,设置DISPLAY环境变量(IP地址为你的windows客户端IP地址) export DISPLAY=192.168.111.155:0.0然后执行dbca就会弹出数据库配置界面了参考链接:https://www.cnblogs.com/iancloud/p/15015683.html

P4070 [SDOI2016] 生成魔咒

P4070 [SDOI2016] 生成魔咒 题目描述 魔咒串由许多魔咒字符组成,魔咒字符可以用数字表示。例如可以将魔咒字符 \(1,2\) 拼凑起来形成一个魔咒串 \([1,2]\)。 一个魔咒串 \(S\) 的非空字串被称为魔咒串 \(S\) 的生成魔咒。 例如 \(S=[1,2,1]\) 时,它的生成魔咒有 \([1],[2],[1…

深入探讨触发器的创建与应用:数据库自动化管理的强大工具

title: 深入探讨触发器的创建与应用:数据库自动化管理的强大工具 date: 2025/1/24 updated: 2025/1/24 author: cmdragon excerpt: 触发器是一种强大的数据库对象,它能够在特定事件发生之前或之后自动执行一组SQL语句。作为一种自动化管理工具,触发器在许多数据库管理场景…

Metasploit Pro 4.22.7-2025012201 (Linux, Windows) - 专业渗透测试框架

Metasploit Pro 4.22.7-2025012201 (Linux, Windows) - 专业渗透测试框架Metasploit Pro 4.22.7-2025012201 (Linux, Windows) - 专业渗透测试框架 Rapid7 Penetration testing, released Jan 22, 2025 请访问原文链接:https://sysin.org/blog/metasploit-pro-4/ 查看最新版。…

VS.net中快捷键收缩和展开代码段

i. Ctrl-M-O 折叠所有方法 ii. Ctrl-M-P 展开所有方法并停止大纲显示(不可以再折叠了) iii. Ctrl-M-M 折叠或展开当前方法 iv. Ctrl-M-L展开所有方法 其他的快捷方式:怎样跳转到指定的某一行? 两种方法:Ⅰ. Ctrl+G Ⅱ. 双击状态栏中的行号2.. 怎样创建矩形选区? 两…

查看Resources.resx的三种方式

同一个Resources.resx文件在Visual Studio 中可以以多种方式查看, 但某一天遇到了问题, 只能以资源浏览器的方式查看, 期初还以为是Visual Studio升级加入的新功能, 怎么都无法打开设计器, 在Resources.resx文件右键菜单中看不到下面的菜单项,经过一些列的摸索, 发现设置…