在我的 ASP.NET Core 应用程序中,我将 appsettings.json 绑定(bind)到强类型类 AppSettings。
public Startup(IHostingEnvironment environment)
{
var builder = new ConfigurationBuilder()
.SetBasePath(environment.ContentRootPath)
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.AddJsonFile($"appsettings.{environment.EnvironmentName}.json", optional: true, reloadOnChange: true)
.AddEnvironmentVariables();
Configuration = builder.Build();
}
public void ConfigureServices(IServiceCollection services)
{
services.Configure<AppSettings>(Configuration);
//...
}
在单例类中,我像这样包装这个 AppSettings 类:
public class AppSettingsWrapper : IAppSettingsWrapper
{
private readonly IOptions<AppSettings> _options;
public AppSettingsAdapter(IOptions<AppSettings> options)
{
_options = options ?? throw new ArgumentNullException("Options cannot be null");
}
public SomeObject SomeConvenienceGetter()
{
//...
}
}
现在,如果 json 文件发生更改,我正在努力重新加载 AppSettings。我在某处读到 IOptionsMonitor 类可以检测更改,但在我的情况下不起作用。
为了测试目的,我尝试像这样调用 OnChange 事件:
public void Configure(IApplicationBuilder applicationBuilder, IOptionsMonitor<AppSettings> optionsMonitor)
{
applicationBuilder.UseStaticFiles();
applicationBuilder.UseMvc();
optionsMonitor.OnChange<AppSettings>(vals =>
{
System.Diagnostics.Debug.WriteLine(vals);
});
}
当我更改 json 文件时,永远不会触发该事件。有人知道我可以更改什么以使重新加载机制在我的场景中工作吗?
最佳答案
您需要注入(inject) IOptionsSnapshot<AppSettings>
才能使重新加载工作。
不幸的是,您无法将 IOptionsSnapshot
加载到 Singleton 服务中。 IOptionsSnapshot
是 Scoped 服务,因此您只能在 Scoped 或 Transient 注册类中引用它。
但是,仔细想想,这是有道理的。设置更改时需要重新加载,因此如果将它们注入(inject)单例,则该类将永远不会获得更新的设置,因为不会再次为单例调用构造函数。
关于c# - 在 ASP.NET Core 中使用 reloadOnChange 重新加载选项,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51097425/