c# - 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 列表默认为空。
我错了什么?
解决方案
如果我BSettings = new List<B>();
从 ctor 中删除 ,则版本 2 有效。
推荐阅读
- c++ - mac下wxWidgets 3.1.3图标加载-ICNS文件不可读?
- facebook-chat - 直接来自 Facebook APP 时,Facebook 客户聊天“视觉卡住”
- css - 如何在不更改 HTML 布局的情况下打破多行?
- reactjs - 材质界面 | 如何更改禁用的输入文本字段的字体颜色?
- java - 多次外部调用同一个Java程序,避免堆空间超出,也会影响统计
- java - 机器人 - 如何检查 jar 的执行是否完成
- c# - 我的单元测试中的无限循环让我感到困惑
- azure - 如何解压或获取存储在 Azure DevOps Build Piplines 的变量组中的嵌套变量的值?
- c# - 如何将 DataGridView 设置为一列宽以填充全宽?
- python - 优雅地编码尝试:除了链