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");
在其他 类(例如控制器)中使用相同的配置值
- 要么注入
IConfiguration
并使用与上面相同的基于密钥的方法。或者
- 向 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。
我正在将一个 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
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");
在其他 类(例如控制器)中使用相同的配置值
- 要么注入
IConfiguration
并使用与上面相同的基于密钥的方法。或者 - 向 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。