【问题标题】:How to pass Configuration to non-controller classes in ASP.NET MVC6如何将配置传递给 ASP.NET MVC6 中的非控制器类
【发布时间】:2015-10-25 05:46:36
【问题描述】:

我正在使用 MVC6 开发应用程序。我可以在启动文件中读取 JSON 配置并将其依赖注入到控制器中。

现在,我的要求是我想访问非控制器类中的配置。在这种情况下,我不能使用构造函数 DI。这些类驻留在 MVC6 应用程序的某个文件夹中,但它们不是模型或控制器类。

在此类非控制器类中访问配置的最佳方式是什么?

谢谢。

更新:

澄清一下 - 我不能在这些类中使用 DI。

这些类仅在需要时根据某些条件进行实例化,并在它们上调用方法。我需要从这些类/方法中访问 JSON 配置设置。所以,目前我只知道这些方法:

  1. 将 Startup 中的 Configuration 属性设为静态,这样我就可以说 Startup.Configuration["..."]

  2. 在读取 JSON 配置后从 Startup 设置自定义类的静态属性,然后访问这些静态属性。

这些替代品好吗(当然除了 DI)?还有其他方法吗?

【问题讨论】:

  • 这些“非控制器类”是什么类?它们在哪里使用?他们的寿命是多少?
  • 有些包含一些业务逻辑,有些是助手和实用程序。他们需要访问存储在配置文件中的设置。
  • 然后将它们连接到 DI 系统并注入它们?
  • 似乎您有一个错误的前提,即您不能将 DI 用于某些类型的类。您可以将它用于任何类型的类,而不仅仅是控制器和模型
  • 我对尝试注入设置的类使用构造函数方法的地方然后抱怨我没有传递设置对象,所以他们需要一直链接到 DI控制器。对吗?

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


【解决方案1】:

我要做的是创建一个像这样的注册服务方法:

 public static void AddMyTools(this IServiceCollection services, IConfiguration config){
      //Save the config in the class
 }

在这个静态方法中,我会将我需要的配置存储在这个静态类中。

然后在 Startup.cs 中我将使用我的工具的命名空间,然后在 ConfigureServices 部分中我将添加我的工具,如下所示:

 services.AddMyTools(Configuration); 

希望对您有所帮助。我没有尝试过,也许有些改变,但你有全局的想法。 (我正在寻找这个,@Sam Farajpour Ghamari 用他的回答给了我这个想法)

【讨论】:

    【解决方案2】:

    您可以将配置注入您想要的任何类。只需在构造方法上注入您的配置类。

    class MyConfig()
    {
       // your configuration members
    }
    
    class MyBLClass(MyConfig config)
    {
        private MyConfig _config;
        public MyBLClass(MyConfig config)
        {
            _config=config;
        }
        // use the _config in your class
    }
    

    在 DI 中只需注册您的 BI 类

    container.RegisterSelf<MyBLClass>(); // just an example read your DI doc
    

    因此,每当您要求您的 DI 定位课程时。配置对象也自动注入到类中。

    作为更好的解决方案,您可以使用接口而不是 Concert 类。

    【讨论】:

      猜你喜欢
      • 2013-01-12
      • 1970-01-01
      • 1970-01-01
      • 2015-07-09
      • 2011-04-08
      • 1970-01-01
      • 2010-09-14
      • 2020-12-18
      • 2011-01-01
      相关资源
      最近更新 更多