[英]How can I convert an IEnumerable<MyType> into a MyList<MyType>?
[英]How can I populated an IEnumerable<MyType>() on an object via configuration?
我正在嘗試使用選項模式填充以下 object :
public class MyParentPolicyOptions
{
public IEnumerable<SomePolicySettings> SomePolicySettings { get; set; }
}
我的配置 json 看起來像這樣:
{
"MyParentPolicy": {
"SomePolicies": [
{
"Name": "Default",
"SomeSetting": 3,
"IsHappy": false
},
{
"Name": "Custom",
"SomeSetting": 5,
"IsHappy": true
}
]
}
對於配置,我執行以下操作:
serviceConfigurationDefinition.Optional("MyParentPolicy", Validators.MyParentPolicyOptions());
在構建配置構建器時,我可以看到它具有以下模式中的預期屬性:
{[MyParentPolicy:SomePolicies:0:Name, Default}]
{[MyParentPolicy:SomePolicies:0:SomeSetting, 3}]
{[MyParentPolicy:SomePolicies:0:IsHappy, false}]
但是,在將此配置根應用到 ServiceConfigurationDefinition 之后,我的實際 MyParentPolicyOptions.SomePolicySettings 仍然是 null。 它似乎適用於其他強類型對象,但我無法讓它適用於 Lists / IEnumerables / arrays 等。
補充一下,我剛剛用 Dictionary<int, SomePolicySetting> 嘗試過這個,希望自動索引意味着這實際上是一個字典類型,但沒有用。
我不知道您使用的serviceConfigurationDefinition.Optional()
方法。 一般來說,我是這樣做的。 你是對的 IEnumerable 正在工作。 問題出在代碼中的其他地方。 以下示例正在運行。
IHost host = Host.CreateDefaultBuilder(args)
.ConfigureServices( (context,services) =>
{
services.AddOptions();
services.Configure<MyParentPolicy>(context.Configuration.GetSection("MyParentPolicy"));
services.AddHostedService<Worker>();
})
.Build();
await host.RunAsync();
public class MyParentPolicy
{
public IEnumerable<SomePolicySettings> SomePolicies { get; set; }
}
public class SomePolicySettings
{
public string Name { get; set; }
public string SomeSetting { get; set; }
public bool IsHappy { get; set; }
}
和appsettings.json
:
{
"MyParentPolicy": {
"SomePolicies": [
{
"Name": "Default",
"SomeSetting": 3,
"IsHappy": false
},
{
"Name": "Custom",
"SomeSetting": 5,
"IsHappy": true
}
]
}
}
最后使用IOptionsMonitor<MyParentPolicy>
檢索選項,例如:
public Worker(ILogger<Worker> logger, IOptionsMonitor<MyParentPolicy> options)
{
_logger = logger;
_parentPolicyOptions = options.CurrentValue;
}
最簡單的方法是從啟動配置中獲取
List<SomePolicySettings> settings= configuration.GetSection("MyParentPolicy")
.Get<MyParentPolicy>().SomePolicies.ToList();
如果您想在應用程序內的任何地方使用它,您可以創建一個服務
啟動
services.Configure<MyParentPolicy>(configuration.GetSection("MyParentPolicy"));
services.AddSingleton<SomePolicySettingsService>();
服務 class
public class SomePolicySettingsService
{
private readonly List<SomePolicySettings> _somePolicySettings;
public SomePolicySettingsService(IOptions<MyParentPolicy> myParentPolicy)
{
_somePolicySettings = myParentPolicy.Value.SomePolicies;
}
public SomePolicySettings GetDefaultPolicySettings()
{
return _somePolicySettings.FirstOrDefault(i=>i.Name=="Default");
}
public SomePolicySettings GetCustomPolicySettings()
{
return _somePolicySettings.FirstOrDefault(i => i.Name == "Custom");
}
}
或者不用創建和注入服務,你可以在你需要的任何地方在構造函數中注入“IOptions myParentPolicy”。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.