【问题标题】:ASP.NET MVC access configuration in static methods静态方法中的 ASP.NET MVC 访问配置
【发布时间】:2018-03-17 16:58:00
【问题描述】:

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

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

【问题讨论】:

  • 公开一个静态属性并在配置启动时设置它。从那里你其他方法将可以访问它
  • @Nkosi 是的,很公平,但听起来有点 hacky,使用全局绕过 DI :-)
  • 好吧,鉴于您无法注入静态类,这是您唯一的选择。除非您从静态 Util 类进行更改并像您拥有 DI 的所有其他地方一样注入配置
  • @Nkosi 我期待有一种方法可以获取 DI 容器并“手动”提取对象。
  • 这仍然意味着在静态类上设置一个静态成员,这与传统的DI不太好。

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


【解决方案1】:

这个问题对我来说似乎很有趣,因为我最近一直在处理类似的事情,并且我有三种不同的方法(非常欢迎 cmets,优点和缺点):

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 实例,我们还可以将许多东西(例如具体参数或客户端)传递给保存环境配置值的服务,并在您第一次需要该配置属性时从静态类调用该服务。

2.- 此处描述了另一种也应该有效的方法(下面的链接),但包含类似的内容,它是将 HostingEnvironment 传递给启动类中相同配置方法中的静态类 (http://www.blakepell.com/asp-net-core-dependency-injection-and-custom-classes)

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

【讨论】:

  • 是的,我认为大多数 DI 容器都无法以您控制的方式从其余代码访问,它们都是关于“控制您的代码”。我们剩下的基本上是将配置转换为全局变量(以静态类的形式),这总是让我很开心,因为这是我们几十年前用来处理全局配置的方式。旧的就是新的,我只是等待一个框架出现,以一种更花哨的方式做到这一点:-)
猜你喜欢
  • 1970-01-01
  • 2018-02-03
  • 2011-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-30
  • 1970-01-01
  • 2016-07-19
相关资源
最近更新 更多