如何在.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
的一个实例,它同时实现了IConfiguration
和IConfigurationRoot
?
是的,向下转型有效,但我不确定这是否是正确的做法@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 的认证?
如何使用 AuthorizationHandlerContext 在 ASP.NET Core 2 自定义基于策略的授权中访问当前的 HttpContext