Configuration.GetValue <T>возвращает ноль, но Bind работает - PullRequest
1 голос
/ 07 мая 2019

У меня проблема с получением данных из моего 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> в этом сценарии?

Заранее спасибо.

1 Ответ

3 голосов
/ 07 мая 2019

GetValue работает только для простых значений, таких как string, int и т. Д., - не пересекает иерархию вложенной конфигурации.

Ссылка Конфигурация в ASP.NET Core: GetValue

ConfigurationBinder.GetValue<T> извлекает значение из конфигурации с указанным ключом и преобразует его в указанный тип. Перегрузка позволяет указать значение по умолчанию, если ключ не найден.

Вместо использования Bind вы можете использовать следующее, чтобы избежать необходимости создавать собственный экземпляр IntegrationsConfigurationDto:

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

Ссылка Конфигурация в ASP.NET Core: привязка к графу объектов

ConfigurationBinder.Get<T> связывает и возвращает указанный тип. Get<T> удобнее, чем Bind.

...