从另一个程序集访问.NET Core配置类

3

在旧时代

在 web.config 文件中,可以将设置放置在 appSettings 部分中,如下所示:

<appSettings>
  <add key="mysetting" value="123"/>
</appSettings>

尽管我的web.config文件在我的Web项目中,但该项目中使用到的任何程序集/库都可以使用以下方式访问设置:
ConfigurationManager.AppSettings["mysetting"]

今天的问题

我开始使用.NET Core,和以前一样,我有一些不是Web项目本身的程序集/库,并且需要访问各种配置设置。

微软的配置文档(https://learn.microsoft.com/en-us/aspnet/core/fundamentals/configuration)以及我能找到的所有其他示例都是将配置类由控制器消耗,并没有提供任何关于如何使其与另一个不是控制器的程序集/库中的类一起工作的指导。

例如,如果我有一个自定义属性可以用来装饰一个类,并且该自定义属性在另一个库中定义(不在Web项目中),并且需要访问一个配置设置,我今天该怎么做呢?在这种情况下,我也不能向构造函数传递任何内容。

2个回答

1
我会假设你在谈论一个ASPNET Core项目,因为你特别提到了web.config。
以下是你需要做的事情。
通常情况下,IOptions<FooSettingsClass>在应用程序启动时进行配置,这意味着它在运行时可用,并且代码类似于:
// Adds services required for using options.
services.AddOptions();
services.Configure<AppSettings>(Configuration.GetSection("FooAppSettings"));

最简单的方法是通过构造函数让框架注入它。通常你会看到它(就像你提到的那样)被注入到控制器中,例如:
class FooController : Controller {
  public FooController(IOptions<FooSettingsClass> settings) { .
    //.. 
  }
}

如果您需要访问此配置,比如说一个服务,那么您只需要在不同的程序集中编写一个构造函数来接受这些选项。因此:
public class SomeServiceInAnotherAssembly {
  public SomeServiceInAnotherAssembly(IOptions<FooSettingsClass> settings) {
    //..
  }
}

这显然意味着你的FooSettingsClass类需要在ASPNET Core项目之外(以避免循环依赖),但这是一种在不编写任何代码的情况下传播配置的方法,我看到其他开发人员也这样做。对我来说,编写代码是一个跳过障碍的解决方案,肯定会有漏洞。

不要忘记在启动时注册你的类(在这个例子中是SomeServiceInAnotherAssembly),即services.AddScoped<SomeServiceInAnotherAssembly>();

这种方法的好处是可以使你的类易于测试。


实际上,这是一个非常相关的问题,很多人都在努力解决。目前的真正答案是 - 微软为CORE提供了system.configuration,值得庆幸。 - T.S.

-2

在2017年8月,微软推出了适用于.NET CORE v4.4的System.Configuration.Manager目前版本为v4.5,还有v4.6的预览版。

安装此NuGet包,并将指令添加到代码文件中。

using System.Configuration;

现在,你可以做你的

var val = ConfigurationManager.AppSettings["mysetting"];

对于网站来说,有一个技巧 - 您不再使用 web.config 来进行应用程序设置和配置部分。您可以在其他类型的项目中使用 app.config。但是,如果您在 ISS 中部署,则可能需要同时使用两者。在 web.config 中,您提供严格的 ISS 相关条目。您的应用程序特定条目放在 app.config 中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接