Как использовать провайдера по умолчанию из appsettings.json, используя if else? - PullRequest
0 голосов
/ 13 ноября 2018

У меня есть 2 провайдера, как вы можете видеть ниже. Если раздел «IsDefaultProvider» имеет значение «true», я хочу получить его значения при внедрении IConfiguration.

Я пишу код ниже, я не мог работать

var providers = configuration.GetSection("X:Providers");
            foreach(var provider in providers.)
            {
                if (providers.GetSection("IsDefaultProvider").Value == "true")
                {
                    _defaultProvider = (XProviderType)Enum.Parse(typeof(XProviderType),  provider.Value.ToString());
                }
            }

Appsettings.json

"X": {
    "Providers": [
      {
        "IsDefaultProvider": false,
        "Name": "***",
        "BaseUrl": "https://*",
        "ApiKey": "*****",
        "SecretKey": "****"
      },
      {
        "IsDefaultProvider": true,
        "Name": "*****",
        "BaseUrl": "http://*"
      }
    ]
  }

Ответы [ 2 ]

0 голосов
/ 14 ноября 2018

В коде, который вы указали в вопросе, есть две проблемы:

  1. providers. не компилируется. Я ожидаю, что это может быть просто плохая копия-паста, но я указываю на всякий случай, так как это должно быть providers.GetChildren().
  2. При синтаксическом анализе логического значения JSON строковое представление, например, True, а не true, поэтому необходимо сравнить с этим (или просто сделать это без учета регистра).

Вот рабочий пример:

var providers = configuration.GetSection("X:Providers");
foreach (var provider in providers.GetChildren())
{
    if (provider.GetSection("IsDefaultProvider").Value.ToLower() == "true")
    {
         _defaultProvider = ...
    }
}

Я бы также поменял использование GetSection("IsDefaultProvider") просто потому, что IsDefaultProvider - это не раздел: это свойство. Вот пример того, как это немного упрощает код:

if (provider["IsDefaultProvider"].ToLower() == "true")

Сказав все это, ответ Тао Чжоу - это гораздо более безопасный для типов способ обработки этого процесса, если у вас нет возражений против создания этих дополнительных классов, поэтому я рекомендую вам рассмотреть возможность использования вместо этого его подход.

0 голосов
/ 14 ноября 2018

Для отображения конфигурации от appsettings.json до Provider, попробуйте выполнить следующие шаги:

  • Определить модель для Provider

    public class Provider
    {
        public bool IsDefaultProvider { get; set; }
        public string Name { get; set; }
        public string BaseUrl { get; set; }
        public string ApiKey { get; set; }
        public string SecretKey { get; set; }
    }
    
    public class X
    {
        public List<Provider> Providers { get; set; }
    }
    
  • Получить поставщика по умолчанию

    var providers = Configuration.GetSection("X").Get<X>();
    foreach (var provider in providers.Providers)
    {
        if (provider.IsDefaultProvider == true)
        {
            //var _defaultProvider = (XProviderType)Enum.Parse(typeof(XProviderType), provider.Value.ToString());
        }
    }
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...