我有两个提供程序,如下所示。如果"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://*"
}
]
}
您在问题中显示的代码中有两个问题:
providers.
不编译。我预计这可能只是一个糟糕的复制粘贴,但我指出它只是以防万一,因为它应该是providers.GetChildren()
- 在解析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()); } }