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

时间:2016-11-03 09:15:21

标签: 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");

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

我尝试更新代码以使用Configuration.GetValue&lt; T&gt;()但是这似乎不适用于对象,只有在提供值的路径时才有效。这让我得到了大多数我的配置类的解决方法,如此

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")
};

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

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

使用以下配置

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

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

4 个答案:

答案 0 :(得分:61)

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

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

原始答案
怎么样:

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

答案 1 :(得分: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");

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

  1. 注入IConfiguration并使用与上述相同的基于密钥的方法。或
  2. 使用DI容器注册强类型配置对象的实例,并将该对象直接注入客户端类。
  3. 以下示例代码:

    //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

答案 2 :(得分:2)

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

E.g。

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>注入您需要的位置。

答案 3 :(得分:0)

如果您想获得第一个“clientName”(预期为“Client1”),请写下:

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

更新评论

安装.NET Core 1.0.1并使用@ TomMakin的方式。