当Sentinel配置项变更时,如何触发回调重新绑定MyAppSettingsClass
配置变更触发回调重新绑定配置类的实现方法
当然可以实现,下面给你两种常用的方式,都能在Sentinel配置变更时自动刷新MyAppSettingsClass的绑定:
方法一:使用IOptionsMonitor自动监听(推荐)
ASP.NET Core自带的IOptionsMonitor<T>本身就支持配置变更自动更新,不用手动调用绑定代码。你只需要保持原来的启动配置,然后在需要用配置的地方注入IOptionsMonitor<MyAppSettingsClass>就行。
启动代码(无需修改)
var builder = WebApplication.CreateBuilder(args); builder.Configuration.AppConfiguration(configuration); builder.Services.Configure<MyAppSettingsClass>(configuration);
使用配置的业务类示例
public class MyBusinessService { private MyAppSettingsClass _currentSettings; private readonly IOptionsMonitor<MyAppSettingsClass> _settingsMonitor; public MyBusinessService(IOptionsMonitor<MyAppSettingsClass> settingsMonitor) { _settingsMonitor = settingsMonitor; // 初始化获取当前配置 _currentSettings = settingsMonitor.CurrentValue; // 注册配置变更回调 settingsMonitor.OnChange(newSettings => { _currentSettings = newSettings; // 这里可以加自定义逻辑,比如打日志、重启某个服务等 }); } }
这种方式是框架自动处理配置刷新,OnChange回调会在Sentinel配置变更时自动触发,直接就能拿到最新的配置实例。
方法二:手动监听配置变更事件
如果你一定要手动调用绑定逻辑,可以通过IConfiguration的变更事件来实现:
实现代码
var builder = WebApplication.CreateBuilder(args); var configuration = builder.Configuration; builder.Configuration.AppConfiguration(configuration); // 初始绑定配置并注册为单例 var appSettings = new MyAppSettingsClass(); configuration.Bind(appSettings); builder.Services.AddSingleton(appSettings); // 监听配置变更 configuration.GetReloadToken().RegisterChangeCallback(state => { var config = (IConfiguration)state; var newSettings = new MyAppSettingsClass(); config.Bind(newSettings); // 获取已注册的单例实例并更新属性 using var scope = builder.Services.BuildServiceProvider().CreateScope(); var existingSettings = scope.ServiceProvider.GetRequiredService<MyAppSettingsClass>(); // 手动复制新配置的属性值(如果属性多可以用AutoMapper简化) existingSettings.Sentinel = newSettings.Sentinel; existingSettings.Common = newSettings.Common; // 其他配置属性... }, configuration);
注意:单例服务注册后不能直接替换实例,所以需要手动把新配置的属性值复制到已有的实例上。
你的ConfigureRefresh配置已经开启了配置自动刷新的基础能力,上面两种方法都能基于这个配置生效,确保Sentinel配置变更时触发对应的刷新逻辑。
内容的提问来源于stack exchange,提问作者Nuno
相关产品推荐
相关产品推荐

