首页 > 解决方案 > IOptions 绑定不适用于嵌套类

问题描述

我有一个工人服务 ind dotnet core 3.1:

程序.cs:

public class Program
    {
        public static void Main(string[] args)
        {
            CreateHostBuilder(args).Build().Run();
        }

        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureServices((hostContext, services) =>
                {
                    var builder = new ConfigurationBuilder()
                        .AddJsonFile("appsettings.json", optional: false)
                        .AddJsonFile($"appsettings.{hostContext.HostingEnvironment.EnvironmentName}.json", optional: true)
                        .AddEnvironmentVariables();

                    var configuration = builder.Build();

                    services.AddOptions();

                    // Version 1
                    services.Configure<A>(configuration);

                    // Version 2
                    //services.Configure<A>(o => configuration.GetSection("PollingSettings").Bind(o));

                    services.AddHostedService<Worker>();
                })
                .UseWindowsService();
    }

appsettings.Development.json:

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "A": {
    "option1": "value1_from_json",
    "option2": -1,
    "BSettings": [
      {
        "Option1": "xxx",
        "Option2": 1
      }
    ]
  }
}

A.cs:

public class A
{
    public A()
    {
        Option1 = "value1_from_ctor";
        BSettings = new List<B>();
    }

    public string Option1 { get; set; }
    public int Option2 { get; set; } = 5;

    public List<B> BSettings { get; set; }
}

B.cs:

public class B
{
    public string Option1 { get; set; }
    public int Option2 { get; set; }
}

版本 1:当我在 Worker 类中注入IOptions<A>时,我从 ctor 获得默认值,尽管它是这样记录的:https://docs.microsoft.com/en-us/aspnet/core/fundamentals/configuration/options?视图=aspnetcore-3.1

版本 2:根 Option1 和 Option2 由 appsettings 填充,但 BSettings 列表默认为空。

我错了什么?

标签: c#.net-coreconfiguration

解决方案


如果我BSettings = new List<B>();从 ctor 中删除 ,则版本 2 有效。


推荐阅读