如何在.net core 2上启动时访问IConfigurationRoot?

Chr*_*rdt 8 c# asp.net-core-mvc asp.net-core asp.net-core-2.0

我已经用ConfigurationProvider实体框架编写了一个自定义.因为我也希望在运行时使其可更新,所以我创建了一个IWritableableOption.

我需要在更新后刷新配置.这可以通过IConfigurationRoot.Reload.

但是,我如何获得IConfigurationRoot.net核心2?

我发现,在以前的版本中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; }
Run Code Online (Sandbox Code Playgroud)

我也发现了,我可以使用自己的实例

WebHost.CreateDefaultBuilder(args).ConfigureAppConfiguration(context, builder) => {
    var configurationRoot = builder.build()
})
Run Code Online (Sandbox Code Playgroud)

但我想更新Startup使用的配置.

那么我怎样才能将其IConfigurationRoot用于Startup将其注入我的服务集合中?

Chr*_*rdt 13

感谢Dealdiane的评论.

我们可以低估IConfiguration:

public Startup(IConfiguration configuration)
{
    Configuration = (IConfigurationRoot)configuration;
}

public IConfigurationRoot Configuration { get; }
Run Code Online (Sandbox Code Playgroud)

我仍然不确定,如果这是预期的方式,因为IConfiguration不做任何保证IConfigurationRoot.


Vah*_*idN 5

或者您可以在初始化之前注入它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>();
    }
}
Run Code Online (Sandbox Code Playgroud)