.net core 从另一个程序集访问.NET核心配置类

.net core 从另一个程序集访问.NET核心配置类,.net-core,configuration,.net Core,Configuration,在过去 在web.config文件中,可以将设置放置在appSettings部分,如下所示: <appSettings> <add key="mysetting" value="123"/> </appSettings> 今天(和问题) 我开始使用.NET core,就像以前一样,我有一些程序集/库,它们本身不是web项目,需要访问各种配置设置 Microsoft的Configuration documentation()以及我能找到的所有其他示例都有控

在过去

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

<appSettings>
  <add key="mysetting" value="123"/>
</appSettings>
今天(和问题)

我开始使用.NET core,就像以前一样,我有一些程序集/库,它们本身不是web项目,需要访问各种配置设置

Microsoft的Configuration documentation()以及我能找到的所有其他示例都有控制器使用的Configuration类,但没有提供任何指导,说明如何使它与另一个程序集/库中的非控制器类一起工作


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

我假设您所说的是一个ASPNET核心项目,因为您特别提到了web.config

这是你需要做的

IOptions
通常在应用程序启动时配置,这意味着它在运行时可以使用类似于下面的代码

// Adds services required for using options.
services.AddOptions();
services.Configure<AppSettings>(Configuration.GetSection("FooAppSettings"));
//添加使用选项所需的服务。
services.AddOptions();
services.Configure(Configuration.GetSection(“FooAppSettings”);
最简单的方法是让框架通过构造函数注入它。通常,您会看到它(如您所述)被注入控制器,如下所示:

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

public class SomeServiceInAnotherAssembly {
  public SomeServiceInAnotherAssembly(IOptions<FooSettingsClass> settings) {
    //..
  }
}
otherassembly中的公共类someservices{
其他程序集中的公共SomeServices(IOOptions设置){
//..
}
}
这显然意味着您的
FooSettingsClass
类需要在您的ASPNET核心项目之外(以避免循环依赖),但这是一种在不编写任何代码的情况下传播配置的方法,这是我看到其他开发人员所做的。对我来说,编写代码是一个跳跃式的解决方案,肯定会有bug

不要忘记您的类(在本例中为
someserviceinotherassembly
)需要在启动时注册,即
services.AddScoped()


这种方法的好处在于它使您的类具有可测试性。

2017年8月,Microsoft推出了适用于.NET CORE v4.4的
System.Configuration.Manager
。和v4.6预览版

安装此nuget软件包。将指令添加到代码文件

using System.Configuration;
现在,你可以做你的工作了

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

不过,网站有一个诀窍——你不再在应用程序设置和配置部分使用
web.config
。您可以使用
app.config
以及其他类型的项目。但如果您部署在ISS中,则可能需要同时使用这两种方法。在
web.config
中,您严格提供ISS相关条目。您的应用程序特定条目进入
app.config

,实际上这是一个非常相关的问题,很多人都在为此而挣扎。到目前为止,真正的答案是——谢天谢地,微软为CORE提供了
system.configuration
var val = ConfigurationManager.AppSettings["mysetting"];