如何在.net core 2 的启动中访问 IConfigurationRoot?

Posted

技术标签:

【中文标题】如何在.net core 2 的启动中访问 IConfigurationRoot?【英文标题】:How to access IConfigurationRoot in startup on .net core 2? 【发布时间】:2018-08-03 00:30:00 【问题描述】:

我用实体框架编写了一个自定义ConfigurationProvider。由于我还想让它在运行时可更新,因此我创建了一个IWritableableOption

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

但是,如何在 .net core 2 中获取 IConfigurationRoot

我发现,在以前的版本中,IConfigurationRoot 是启动的一部分。然而,在 .net core 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 使用的配置。

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

【问题讨论】:

Startup 中传递的configuration 参数不是ConfigurationRoot 的一个实例,它同时实现了IConfigurationIConfigurationRoot 是的,向下转型有效,但我不确定这是否是正确的做法@Dealdiane 【参考方案1】:

感谢Dealdiane's 评论。

我们可以低调IConfiguration:

public Startup(IConfiguration configuration)

    Configuration = (IConfigurationRoot)configuration;


public IConfigurationRoot Configuration  get; 

我仍然不确定,这是否是预期的方式,因为IConfiguration 不对IConfigurationRoot 做出任何保证。

【讨论】:

【参考方案2】:

或者你可以在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>();
    

【讨论】:

以上是关于如何在.net core 2 的启动中访问 IConfigurationRoot?的主要内容,如果未能解决你的问题,请参考以下文章

在 Asp.net core 2.2.1 中访问 XMLHttpRequest

如何从 Asp.NET Core 3.1 启动类访问 launchSettings.json 中的 `applicationUrl` 属性?

如何在 ASP.NET (Core 2) Web 应用程序中访问来自 AWS 的认证?

我可以在 ASP.NET Core 启动期间访问数据库吗?

如何使用 AuthorizationHandlerContext 在 ASP.NET Core 2 自定义基于策略的授权中访问当前的 HttpContext

ASP.NET Core 访问控制器构造函数中的 User.Identity