为什么不调用 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);