Being able to reload configuration on change is typically a key requirement. ASP.NET core configuration infrastructure provides a reloadOnChange property that you can set:
var builder = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
.AddEnvironmentVariables();
Configuration = builder.Build();
However, your application still has to handle the change. In asp.net core, this is via a IChangeToken and the Configuration class provides a GetReloadToken().RegisterChangeCallback - the only trouble is that this is fired only once since the change token can change.
The easy way around this is to use the ChangeToken utility - like so:
var valuesConfig = new ValuesConfig();
Configuration.GetSection("ValuesConfig").Bind(valuesConfig);
services.AddSingleton(valuesConfig);
Action onChange = () =>
{
Configuration.GetSection("ValuesConfig").Bind(valuesConfig);
Console.WriteLine("onChange fired!");
};
ChangeToken.OnChange(() => Configuration.GetReloadToken(), onChange);
What's interesting though that while this works, the on change handler ends up getting called twice for each change!
No comments :
Post a Comment