C# Option Patterns无法重载:IOptionsMonitor未触发变更回调
问题解决方法
问题根源在于你用configuration.Bind(profile)手动绑定配置的方式,没有让Options系统关联配置的变更令牌,导致IOptionsMonitor无法感知配置文件的修改。
两种可行的修复方案:
方案1:直接传入配置对象让Options自动绑定
把.Configure<Profile>(profile => configuration.Bind(profile))替换成:
.Configure<Profile>(configuration)
如果你的配置文件里Profile是一个独立的配置节,就改成传入对应节:
.Configure<Profile>(configuration.GetSection("Profile"))
方案2:在Configure中注入IConfiguration(更符合依赖注入规范)
如果是在依赖注入环境中,更推荐通过注入IConfiguration来绑定,这样能更好地利用框架的变更跟踪:
.Configure<Profile>((serviceProvider, profile) => { var config = serviceProvider.GetRequiredService<IConfiguration>(); config.Bind(profile); })
修改后的完整代码示例
public static void Run() { var configuration = new ConfigurationBuilder() .AddJsonFile(path: "Properties/profile.json", optional: false, reloadOnChange: true) .Build(); ChangeToken.OnChange( () => configuration.GetReloadToken(), () => Console.WriteLine("Changed")); new ServiceCollection() .AddOptions() .AddSingleton<IConfiguration>(configuration) // 注入配置对象 .Configure<Profile>(configuration) // 使用方案1的绑定方式 .BuildServiceProvider() .GetRequiredService<IOptionsMonitor<Profile>>() .OnChange(profile => Console.WriteLine("Changed!")); Console.Read(); }
为什么这样能解决问题
当你让Options系统直接接管配置绑定(不管是传入配置对象还是通过注入的IConfiguration绑定),框架会自动将配置的变更令牌和IOptionsMonitor关联起来。一旦配置文件修改,变更令牌触发时,Options系统会重新绑定配置对象,并触发OnChange回调。而原来的手动Bind只是一次性赋值,完全没有和配置的变更跟踪机制挂钩,自然不会触发回调。
内容的提问来源于stack exchange,提问作者Teg
相关产品推荐
相关产品推荐

