C# 启动中的ASP.NET核心配置部分
我正在将一个ASP.NET 5 RC1项目迁移到ASP.NET Core,遇到了一个有趣的问题,我还没有看到,也没有找到解决方案 为了在Startup中使用配置设置,我以前通过以下方式检索了配置C# 启动中的ASP.NET核心配置部分,c#,asp.net-core,asp.net-core-1.0,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("SomeConfiguration
// 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");
使用以下配置
"configuredClients": {
"clients": [
{
"clientName": "Client1",
"clientId": "Client1"
},
{
"clientName": "Client2",
"clientId": "Client2"
}
]
}
在以前绑定到我的配置类的Clients属性的地方没有问题,我在ASP.NET Core 1.0中再也找不到这样做的方法了 对于ASP Core 1.1.0,通用模型绑定现在使用
Get
:
var config = Configuration.GetSection("configuredClients").Get<ClientConfiguration>();
var config=Configuration.GetSection(“ConfiguredClient”).Get();
原始答案
这个怎么样:
var config = Configuration.GetSection("configuredClients").Bind<ClientConfiguration>();
var config=Configuration.GetSection(“ConfiguredClient”).Bind();
通常您自己不会在ASP.NET Core中手动读取配置,而是创建一个与您的定义匹配的对象。你可以在官方文件中阅读更多关于这方面的内容
例如
公共类MyOptions
{
公共字符串选项1{get;set;}
公共int选项2{get;set;}
}
public void配置服务(IServiceCollection服务)
{
//使用DI设置选项
services.AddOptions();
服务。配置(配置);
}
然后您只需在需要的地方插入选项。如果您想获得第一个“clientName”(预期为“Client1”),只需写:
Configuration.GetSection("configuredClients")["clients:0:clientName"];
更新以供评论
安装.NET Core 1.0.1并按照@TomMakin的方式进行。使用ASP.NET Core 2.0(基本上是Core 1.1+),将
IConfiguration
注入启动中,并且可以在配置服务()
和配置()
方法中使用
如接受的答案所示,配置可以绑定到对象。但是,如果只需要一个值,则基于键的方法效果良好
IConfiguration
仍然使用冒号:
分隔字符串键。对于数组
,使用基于0的索引。或者对相同的键使用genericgetValue()
方法。见下例:
var clientId2 = Configuration["configuredClients:clients:1:clientId"]?.ToString();
var clientName1 = Configuration.GetValue<string>("configuredClients:clients:0:clientName");
更多示例。同样不起作用,即使配置对象和json对象按照您建议的方式匹配,我仍然会得到null。稍后配置服务并注入IOptions似乎可以很好地检索配置值。问题是,当我试图检索那些在Startup中使用的值时,我不能100%确定您的意思,但在配置方法期间使用DI容器会对您有所帮助吗?我认为可以在那里使用容器,但找不到如何做到这一点。这是一篇关于如何使用强类型配置节的好文章:感谢您的帮助,但这并不是我遇到的问题的解决方案。将Configuration和ConfigurationExtensions软件包更新为1.1.0-preview1-final@Tom Makin后,其解决方案非常完美。很抱歉,我帮不上忙,似乎我部分误解了您的问题:)我想要完整的客户列表,显然,由于它是可配置的,因此有x个客户端需要在以后的配置设置中使用。因此,这不是一个切实可行的解决方案。安装.NET Core 1.0.1并按照@TomMakin的方式进行安装。可能值得注意的是,我必须将Microsoft.Extensions.Configuration和Microsoft.Extensions.Options.ConfigurationExtensions更新为1.1.0-preview1-Finalh。在1.1的最终版本中,此功能是否再次被删除?看起来它可能已重命名为获取
。为了在1.1中工作,我必须从NuGet添加Microsoft.Extensions.Configuration.Binder。对于您介绍的场景,最好的解决方案是执行服务.Configure(Configuration.GetSection(“configuredClient”)
,而不是将IConfiguration
注入控制器injectionIOptions
,我展示了注入IConfiguration
作为选项之一,我还展示了直接注入ClientConfiguration
。“最佳”解决方案取决于多个因素。使用IOptions
也是一个选项,IOptionsSnapshot
和其他选项也是一个选项。
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);
}
Configuration.GetSection("configuredClients")["clients:0:clientName"];
var clientId2 = Configuration["configuredClients:clients:1:clientId"]?.ToString();
var clientName1 = Configuration.GetValue<string>("configuredClients:clients:0:clientName");
//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");
}
}