簡體   English   中英

如何填充 IEnumerable<mytype> () 在 object 上通過配置?</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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM