我已经用实体框架编写了一个自定义ConfigurationProvider
。由于我还希望在运行时使其可更新,因此我创建了IWritableableOption
。
我需要在更新后刷新配置。这可以通过IConfigurationRoot.Reload
完成。
但是,如何在.net核心2中获取IConfigurationRoot
?
我发现,在以前的版本中,IConfigurationRoot
是启动的一部分。但是在.net核心2中,我们只有更简单的类型IConfiguration
:
public Startup(IConfiguration configuration)
{
// I tried to change this to IConfigurationRoot,
// but this results in an unresolved dependency error
Configuration = configuration;
}
public IConfiguration Configuration { get; }
我也发现了,我可以使用
获取自己的实例WebHost.CreateDefaultBuilder(args).ConfigureAppConfiguration(context, builder) => {
var configurationRoot = builder.build()
})
但我想更新Startup使用的配置。
那么如何才能将IConfigurationRoot
Startup
用于将其注入我的服务集合中呢?
答案 0 :(得分:7)
感谢Dealdiane's评论。
我们可以转发IConfiguration
:
public Startup(IConfiguration configuration)
{
Configuration = (IConfigurationRoot)configuration;
}
public IConfigurationRoot Configuration { get; }
我仍然不确定,如果这是预期的方式,因为IConfiguration
不对IConfigurationRoot
做出任何保证。
答案 1 :(得分:0)
或者您可以在初始化Startup
之前注入它:
public class Program
{
public static void Main(string[] args)
{
CreateWebHostBuilder(args).Build().Run();
}
public static IWebHostBuilder CreateWebHostBuilder(string[] args)
{
IConfigurationRoot configurationRoot = null;
return WebHost.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((context, builder) =>
{
configurationRoot = builder.Build();
})
.ConfigureServices(services =>
{
services.AddSingleton<IConfigurationRoot>(configurationRoot);
services.AddSingleton<IConfiguration>(configurationRoot);
})
.UseStartup<Startup>();
}
}