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

Aar*_*ord 46 c# asp.net-core asp.net-core-1.0

我正在将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");
Run Code Online (Sandbox Code Playgroud)

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

我已经尝试更新代码以使用Configuration.GetValue <T>()但是这似乎不适用于对象,并且仅在提供值的路径时才起作用.这为我的大多数配置类留下了一个解决方法,就像这样

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")
};
Run Code Online (Sandbox Code Playgroud)

但是,当配置类包含对象数组时,这是一个问题.在我的例子中是一个Client对象数组

public class ClientConfiguration
{
    public Client[] Clients { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

使用以下配置

"configuredClients": {
  "clients": [
    {
      "clientName": "Client1",
      "clientId": "Client1"
    },
    {
      "clientName": "Client2",
      "clientId": "Client2"
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

以前绑定到我的配置类的Clients属性没问题,我再也找不到在ASP.NET Core 1.0中这样做的方法

Tom*_*kin 68

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

var config = Configuration.GetSection("configuredClients").Get<ClientConfiguration>();
Run Code Online (Sandbox Code Playgroud)

原始答案
怎么样:

var config = Configuration.GetSection("configuredClients").Bind<ClientConfiguration>();
Run Code Online (Sandbox Code Playgroud)

  • 看起来它可能已经被重命名为`Get <>`.https://docs.microsoft.com/en-us/aspnet/core/fundamentals/configuration#binding-to-an-object-graph (5认同)

Arg*_*a C 5

使用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");
Run Code Online (Sandbox Code Playgroud)

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

  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");
    }
}
Run Code Online (Sandbox Code Playgroud)

这里有更多示例。