如何使用if-else从appsettings.json默认提供程序



我有两个提供程序,如下所示。如果"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://*"
      }
    ]
  }

您在问题中显示的代码中有两个问题:

  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")

说了这么多,如果你不反对创建这些额外的类,那么周的答案是一种更安全的方法来处理这个过程,所以我鼓励你考虑使用他的方法。

要将配置从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());
        }
    }
    

最新更新