ASP.NET 启动中的核心配置部分

ASP.NET Core Configuration Section in Startup

我正在将一个 ASP.NET 5 RC1 项目迁移到 ASP.NET Core,并且遇到了一个有趣的问题,我还没有看到,也没有找到解决方案。

为了在 Startup 中使用配置设置,我之前通过以下方式检索了配置

// Works fine for DI both in ASP.NET 5 RC1 and ASP.NET Core
services.Configure<SomeConfigurationClass>(Configuration.GetSection("SomeConfigurationSection"));

// How I previous retrieved the configuration for use in startup. 
// No longer available in ASP.NET Core
var someConfigurationToUseLater = Configuration.Get<SomeConfigurationClass>("SomeConfigurationSection");

更新到 ASP.NET Core 1.0 后,似乎 Configuration.Get() 不再可用。

我已经尝试更新代码以使用 Configuration.GetValue() 但这似乎不适用于对象并且仅在提供值的路径时才有效。这为我的 大多数 配置 class 留下了解决方法

var someConfigurationName = "someConfiguration";    
var someConfigurationClass = new SomeConfigurationClass()
{
    Value1 = Configuration.GetValue<string>($"{someConfigurationName}:value1"),
    Foo = Configuration.GetValue<string>($"{someConfigurationName}:foo"),
    Bar = Configuration.GetValue<string>($"{someConfigurationName}:bar")
};

然而,当配置 class 包含一个对象数组时,这是一个问题。在我的例子中,一组客户端对象

public class ClientConfiguration
{
    public Client[] Clients { get; set; }
}

配置如下

"configuredClients": {
  "clients": [
    {
      "clientName": "Client1",
      "clientId": "Client1"
    },
    {
      "clientName": "Client2",
      "clientId": "Client2"
    }
  ]
}

以前这会绑定到我的配置 属性 的客户端 class 没问题,我在 ASP.NET Core 1.0[=15 中找不到这样做的方法=]

更新答案
对于 ASP 核心 1.1.0 通用模型绑定现在使用 Get:

完成
var config = Configuration.GetSection("configuredClients").Get<ClientConfiguration>();

原答案
这个怎么样:

var config = Configuration.GetSection("configuredClients").Bind<ClientConfiguration>();

您通常不会在 ASP.NET Core 中自己手动读取配置,而是创建一个与您的定义相匹配的对象。您可以在官方文档 here.

中阅读更多相关信息

例如

public class MyOptions
{
    public string Option1 { get; set; }
    public int Option2 { get; set; }
}

public void ConfigureServices(IServiceCollection services)
{
    // Setup options with DI
    services.AddOptions();
    services.Configure<MyOptions>(Configuration);
}

然后您只需在需要的地方注入选项 IOptions<MyOptions>

如果你想得到第一个"clientName"(预计"Client1"),只需写:

Configuration.GetSection("configuredClients")["clients:0:clientName"];

评论更新

安装 .NET Core 1.0.1 并按照@TomMakin 的方式进行。

使用ASP.NET Core 2.0(基本上是Core 1.1+),将IConfiguration注入Startup,即可使用在 ConfigureServices()Configure() 方法中。

如接受的答案所示,配置可以绑定到一个对象。但是如果只需要一个值,基于键的方法效果很好。

IConfiguration 仍然可以使用冒号 : 分隔的字符串键。对于 array,使用基于 0 的索引。或者使用具有相同键的通用 getValue<T>() 方法。请参见下面的示例:

var clientId2 = Configuration["configuredClients:clients:1:clientId"]?.ToString();
var clientName1 = Configuration.GetValue<string>("configuredClients:clients:0:clientName");

在其他 类(例如控制器)中使用相同的配置值

  1. 要么注入 IConfiguration 并使用与上面相同的基于密钥的方法。或者
  2. 向 DI 容器注册一个强类型配置对象的实例,并将该对象直接注入客户端 类。

示例代码如下:

//In Startup.ConfigureServices()
var clientConfig = Configuration.GetSection("configuredClients")
    .Get<ClientConfiguration>();
services.AddSingleton(clientConfig);

//Controller
public class TestController : Controller
{
    IConfiguration _configStore;
    ClientConfiguration _clientConfiguration;

    public TestController(IConfiguration configuration, 
        ClientConfiguration clientConfiguration)
    {
        _configStore = configuration;
        _clientConfiguration = clientConfiguration;
    }

    public IActionResult Get()
    {
        //with IConfiguration
        var clientId1 = _configStore
            .GetValue<string>("configuredClients:clients:0:clientId");

        //with strongly typed ClientConfiguration
        var clientName1 = _clientConfiguration.Clients[0]?.ClientName;

        return new OkObjectResult("Configuration test");
    }
}

更多示例here