Configuration.GetValue<T> 返回 null 但 Bind 有效

Joã*_*hin 3 c# appsettings .net-core asp.net-core

我在从我的appsettings.json. 该文件如下所示:

  "Integrations": {
    "System01": {
      "Host": "failover://(tcp://localhost:61616)?transport.timeout=2000",
      "User": "admin",
      "Password": "admin"
    },
    "System02": {
      "Host": "failover://(tcp://localhost:61616)?transport.timeout=2000",
      "User": "admin",
      "Password": "admin"
    },
  }
Run Code Online (Sandbox Code Playgroud)

我有以下 DTO:

public class IntegrationsConfigurationDto
{
    public string Host { get; set; }
    public string User { get; set; }
    public string Password { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

当尝试阅读它时:

var config = _configuration.GetValue<IntegrationsConfigurationDto>("Integrations:System01");
Run Code Online (Sandbox Code Playgroud)

我明白了null。但如果我这样做:

var config = new IntegrationsConfigurationDto();
_config.Bind("Integrations:System01", config);
Run Code Online (Sandbox Code Playgroud)

我在config变量中正确获取了值。

为什么会这样?GetValue<T>在这种情况下如何使用?

提前致谢。

Kir*_*kin 10

GetValue只适用于简单的值,比如stringint等-它不经过嵌套结构的层次结构。

参考:ASP.NET Core 中的配置:GetValue

ConfigurationBinder.GetValue<T>从具有指定键的配置中提取值并将其转换为指定类型。如果未找到键,重载允许您提供默认值。

不要使用Bind,而是使用以下内容来避免创建自己的 实例IntegrationsConfigurationDto

var config = _configuration.GetSection("Integrations:System01")
    .Get<IntegrationsConfigurationDto>();
Run Code Online (Sandbox Code Playgroud)

参考:ASP.NET Core 中的配置:绑定到对象图

ConfigurationBinder.Get<T>绑定并返回指定的类型。Get<T>比使用更方便Bind