静态方法中的ASP.NET MVC访问配置

时间:2017-10-05 23:53:22

标签: c# dependency-injection asp.net-core asp.net-core-mvc

我正在使用asp.net核心并使用标准的DI机制将应用程序配置加载到控制器中,但我现在需要在静态类中使用静态方法访问配置(它是一堆辅助方法,在这种情况下,需要一些配置设置)

到目前为止,我一直在传递相关设置条目作为参数,但我想知道是否有更好的方法直接从DI服务集合存储它的任何地方获取整个配置对象。

1 个答案:

答案 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;
        }