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

Configuration.GetValue<T> returning null but Bind works

我在从 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"
    },
  }

我有以下 DTO:

public class IntegrationsConfigurationDto
{
    public string Host { get; set; }
    public string User { get; set; }
    public string Password { get; set; }
}

尝试阅读时:

var config = _configuration.GetValue<IntegrationsConfigurationDto>("Integrations:System01");

我得到 null。但如果我这样做:

var config = new IntegrationsConfigurationDto();
_config.Bind("Integrations:System01", config);

我在我的 config 变量中得到了正确的值。

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

提前致谢。

GetValue 仅适用于简单值,例如 stringint 等 - 它不会遍历嵌套配置的层次结构。

参考:Configuration in ASP.NET Core: GetValue

ConfigurationBinder.GetValue<T> extracts a value from configuration with a specified key and converts it to the specified type. An overload permits you to provide a default value if the key isn't found.

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

var config = _configuration.GetSection("Integrations:System01")
    .Get<IntegrationsConfigurationDto>();

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

ConfigurationBinder.Get<T> binds and returns the specified type. Get<T> is more convenient than using Bind.