在我的 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/

10-12 12:49
查看更多