我已经能够在 ASP.NET 5 中设置强类型配置,并且它运行得很好。我还将配置设置为在
.json
配置文件更改时自动重新加载。但这似乎只有在我使用非类型化配置时才有效。当 .json
文件更改时,强类型配置类仍保留旧值。
我正在设置这样的配置:
public IConfiguration Configuration { get; set; }
public Startup(IHostingEnvironment env, IApplicationEnvironment appEnv)
{
// Setup configuration sources
var builder = new ConfigurationBuilder()
.AddJsonFile("config.json")
.AddJsonFile($"config.{env.EnvironmentName}.json");
Configuration = builder.Build()
.ReloadOnChanged("config.json")
.ReloadOnChanged($"config.{env.EnvironmentName}.json");
/* ... (unrelated stuff edited away) ... */
}
并像这样绑定它:
public void ConfigureServices(IServiceCollection services)
{
/* ... (unrelated stuff edited away) ... */
services.AddOptions();
services.AddInstance(Configuration);
services.Configure<AppSettings>(Configuration.GetSection("AppSettings"));
services.Configure<DbSettings>(Configuration.GetSection("DbSettings"));
/* ... (unrelated stuff edited away) ... */
}
(配置文件如下所示:)
{
"AppSettings": {
"This": "that",
"Foo": "bar"
/* etc... */
},
"DbSettings": {
/* (db settings here) */
}
}
(我相应地有一个这样的 C# 类:)
public class AppSettings
{
public string This { get; set; }
public string Foo { get; set; }
/* etc... */
}
当我通过依赖注入获取
IOptions<AppSettings>
时,当我更改 config.json
和 config.Dev.json
文件时,它不会改变。我必须重新启动整个网络应用程序才能更新配置类。但如果我改用无类型的 IConfiguration
实例,当我更改 json 文件时它会自动更改。
所以问题是:如何在更改 .json 文件时更改强类型配置,而无需重新启动 web 应用程序?
在 asp.net core 1.1 上它通过 IOptionsSnapshot
修复当调用
Configuration.GetSection()
时,它会在启动时传入该部分一次。
为了在运行时更新
AppSettings
选项,您必须将 AppSettings
选项绑定到配置节。
services.Configure<AppSettings>(option => Configuration.GetSection("AppSettings").Bind(option));
距 ASP.NET 5 已经有一段时间了,但目前文档很清楚,
IOptions<T>
未读取更改。与 IOptionsSnapshot
或 IOptionsMonitor
使用
Bind
或 Get<T>
方法时也会读取更改,但不仅仅是调用 GetSection