Why is IOptionsMonitor<T>.OnChange not being called?

Viewed 3987

I'd like to have my .Net Core 3.1 app automatically reload its configuration as the file changes on disk, but I'm having trouble getting this to work with the Options pattern. I run my app, save changes to the config file, and it's never called. Why doesn't the IOptionsMonitor instance ever call the OnChange handler? What am I missing?

Program.cs IHostBuilder creation

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));
    })

Service that uses 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
    }
}
1 Answers

As @Nkosi pointed out in comments, this line was the problem:

    // Wrong
    .Configure<MySeparateConfig>(c => separateConfig.Bind(c));

When I replaced it with the line below, everything started working right:

    // Right
    .Configure<MySeparateConfig>(separateConfig);
Related