【问题标题】:Configuration.GetValue<T> returning null but Bind worksConfiguration.GetValue<T> 返回 null 但 Bind 有效
【发布时间】:2022-03-29 14:22:07
【问题描述】:

我在从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&lt;T&gt;

提前致谢。

【问题讨论】:

  • 为什么不能使用第二种方法?
  • 我可以。只是想知道为什么第一个不起作用,以及是否有什么我可以做的。
  • 我认为 GetValue 用于单个值,而不是用于部分。

标签: c# asp.net-core .net-core appsettings


【解决方案1】:

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

参考:Configuration in ASP.NET Core: GetValue

ConfigurationBinder.GetValue&lt;T&gt; 使用指定键从配置中提取值并将其转换为指定类型。如果找不到键,重载允许您提供默认值。

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

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

参考:Configuration in ASP.NET Core: Bind to an object graph

ConfigurationBinder.Get&lt;T&gt; 绑定并返回指定的类型。 Get&lt;T&gt; 比使用 Bind 更方便。

【讨论】:

    猜你喜欢
    • 2018-05-29
    • 2019-05-27
    • 2016-05-21
    • 2016-10-06
    • 2021-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多