强类型的ASP.Net核心实时更新配置

时间:2016-10-15 13:24:59

标签: c# json asp.net-core configuration

我正在尝试ASP.Net Core而我和我正在讨论新的配置实现。我创建了这样的配置:

public Startup(IHostingEnvironment env)
{
     var builder = new ConfigurationBuilder()
        .SetBasePath(env.ContentRootPath)
        .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
        .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: true)
        .AddEnvironmentVariables()
        .AddUserSecrets();

    ConfigurationManager.SetConfiguration(builder.Build());
}

我有自己的ConfigurationManager类,它基本上包含IConfigurationRoot,并且我有一些帮助方法。

public static class ConfigurationManager
{
    private static IConfigurationRoot _configuration { get; set; }

    public static IConfigurationRoot GetConfiguration()
    {
        return _configuration;
    }

    public static void SetConfiguration(IConfigurationRoot configuration)
    {
        _configuration = configuration;
    }

    public static string GetString(string appSettingKey)
    {
        return _configuration.GetValue<string>(appSettingKey);
    }

    public static IConfigurationSection GetSection(string sectionKey)
    {
        return _configuration.GetSection(sectionKey);
    }
}

我可以访问我的&#39; Foo&#39;设置如下:

var foo = ConfigurationManager.GetString("Foo");

当我运行我的应用程序时,上面的代码将为我提供&#39; Foo&#39;的价值,这是&#34; Bar&#34;。如果我改变了&#39; Foo&#39;在我的applicationsettings.json中,来自&#34; Bar&#34;到&#34; BarBar&#34;当我的应用程序仍在运行并遇到上面的代码时,它将为我提供“Foo”的新价值。

我创建了一个Configuration类,因此我可以将我的设置设置为强类型。

public class Configuration
{
    public string Foo { get; set; }
}

我将它绑定到我的配置中:

services.Configure<Configuration>(ConfigurationManager.GetConfiguration());

我可以访问&#39; Foo&#39;在我的控制器中设置依赖注入,如下所示:

public MyController(IOptions<Configuration> config)
{
    var foo = config.Value.Foo;
}

当我给控制器打电话时,&#39; Foo&#39;是&#34; Bar&#34;。当我改变&#39; Foo&#39;的价值时进入&#34; BarBar&#34;然后再次打电话给控制器&#39; Foo&#39;仍然是&#34; Bar&#34;在我的强类型配置中。

当我在动态更改applicationsettings.json时,有没有办法让强类型类更改,就像我不使用强类型类一样?

1 个答案:

答案 0 :(得分:1)

如果您使用的是ASP.NET Core 1.1,则可以使用

获取强类型配置的更新
  

IOptionsSnapshot

其中T是强类型配置类。

您可以在IOptionsSnapshot部分找到工作示例here并详细了解here