我正在使用asp.net核心并使用标准的DI机制将应用程序配置加载到控制器中,但我现在需要在静态类中使用静态方法访问配置(它是一堆辅助方法,在这种情况下,需要一些配置设置)
到目前为止,我一直在传递相关设置条目作为参数,但我想知道是否有更好的方法直接从DI服务集合存储它的任何地方获取整个配置对象。
答案 0 :(得分:3)
这个问题对我来说似乎很有意思,因为我最近一直在处理类似的事情,我有三种不同的方法(非常欢迎评论,利弊):
1.A。 - 第一个也是hacky ...如果你添加一个扩展方法(让我们称之为UtilsProvider)然后你得到配置调用
中的estension方法怎么办? public static class UtilsProvider
{
private static string _configItemOne;
public static IServiceProvider SetUtilsProviderConfiguration(this IServiceProvider serviceProvider, IConfigurationRoot configuration)
{
// just as an example:
_configItemOne= configuration.GetValue<string>("CONFIGITEMONE");
return serviceProvider;
}
// AND ALL YOUR UTILS THAT WOULD USE THAT CONFIG COULD USE IT
}
并且,将从您的Startup类Configure方法调用该扩展方法:
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory, IServiceProvider serviceProvider)
{
#region AddUtilsConfig
serviceProvider.SetUtilsProviderConfiguration(Configuration);
#endregion
...
1.B。 - 不是传递整个IConfigurationRoot实例,我们可以将许多内容(如具体参数或客户端)传递给保存环境配置值的Service,并在第一次需要该configu属性时从静态类中调用该服务。
2.-另一种也应该起作用的方法在这里描述(链接如下),但是包含类似的东西,它是将HostingEnvironment传递给启动类(http://www.blakepell.com/asp-net-core-dependency-injection-and-custom-classes)中相同的Configure方法中的一个estatic类
public static class UtilsProvider
{
public static IHostingEnvironment HostingEnvironment { get; set; }
...
}
在创业公司......
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
...
// Have to be careful with static properties, they persist throughout the life time
// of the application.
UtilsProvider.HostingEnvironment = env;
}