为什么不调用 IOptionsMonitor<T>.OnChange?
Why is IOptionsMonitor<T>.OnChange not being called?
我想让我的 .Net Core 3.1 应用程序在磁盘上的文件更改时自动重新加载其配置,但我无法使其与选项模式一起使用。我 运行 我的应用程序,将更改保存到配置文件,但从未调用过。为什么 IOptionsMonitor 实例不调用 OnChange 处理程序?我错过了什么?
Program.cs IHostBuilder 创建
Host.CreateDefaultBuilder(args)
.ConfigureAppConfiguration(config => configuration = config.Build())
.ConfigureServices((hostContext, services) => {
var separateConfig = new ConfigurationBuilder()
.AddJsonFile("SeparateConfig.json", optional: false, reloadOnChange: true)
.Build();
services
.AddSingleton<MyMainService>()
.Configure<MySeparateConfig>(c => separateConfig.Bind(c));
})
使用 MySeparateConfig 的服务
public class MyMainService
{
public MyMainService(IOptionsMonitor<MySeparateConfig> config)
{
if (config is null) throw new ArgumentNullException(nameof(config));
ConfigChangeHandle = config.OnChange(UpdateConfiguration);
// Perform initial configuration using config.CurrentValue here
}
private IDisposable ConfigChangeHandle { get; set; }
private void UpdateConfiguration(MySeparateConfig config)
{
// Never called
}
}
正如@Nkosi 在评论中指出的,这一行就是问题所在:
// Wrong
.Configure<MySeparateConfig>(c => separateConfig.Bind(c));
当我用下面的行替换它时,一切开始正常工作:
// Right
.Configure<MySeparateConfig>(separateConfig);
我想让我的 .Net Core 3.1 应用程序在磁盘上的文件更改时自动重新加载其配置,但我无法使其与选项模式一起使用。我 运行 我的应用程序,将更改保存到配置文件,但从未调用过。为什么 IOptionsMonitor 实例不调用 OnChange 处理程序?我错过了什么?
Program.cs IHostBuilder 创建
Host.CreateDefaultBuilder(args)
.ConfigureAppConfiguration(config => configuration = config.Build())
.ConfigureServices((hostContext, services) => {
var separateConfig = new ConfigurationBuilder()
.AddJsonFile("SeparateConfig.json", optional: false, reloadOnChange: true)
.Build();
services
.AddSingleton<MyMainService>()
.Configure<MySeparateConfig>(c => separateConfig.Bind(c));
})
使用 MySeparateConfig 的服务
public class MyMainService
{
public MyMainService(IOptionsMonitor<MySeparateConfig> config)
{
if (config is null) throw new ArgumentNullException(nameof(config));
ConfigChangeHandle = config.OnChange(UpdateConfiguration);
// Perform initial configuration using config.CurrentValue here
}
private IDisposable ConfigChangeHandle { get; set; }
private void UpdateConfiguration(MySeparateConfig config)
{
// Never called
}
}
正如@Nkosi 在评论中指出的,这一行就是问题所在:
// Wrong
.Configure<MySeparateConfig>(c => separateConfig.Bind(c));
当我用下面的行替换它时,一切开始正常工作:
// Right
.Configure<MySeparateConfig>(separateConfig);