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

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

我正在将一个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");
使用以下配置

"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的索引。或者对相同的键使用generic
getValue()
方法。见下例:

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
注入控制器injection
IOptions
,我展示了注入
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");
    }
}