【发布时间】:2019-09-21 02:49:44
【问题描述】:
有什么方法可以以强类型的方式从appsettings.json 读取多态对象?下面是我需要的一个非常简化的示例。
我有多个应用组件,在此处命名为 Features。这些组件由工厂在运行时创建。我的设计意图是每个组件都由其单独的强类型选项配置。在此示例中,FileSizeCheckerOptions 和 PersonCheckerOption 是这些的实例。每个功能都可以通过不同的选项多次包含。
但是使用现有的 ASP.NET Core 配置系统,我无法读取 多态 强类型选项。如果设置是由 JSON 反序列化器读取的,我可以使用 something like this。但appsettings.json 的情况并非如此,其中选项只是键值对。
appsettings.json
{
"DynamicConfig":
{
"Features": [
{
"Type": "FileSizeChecker",
"Options": { "MaxFileSize": 1000 }
},
{
"Type": "PersonChecker",
"Options": {
"MinAge": 10,
"MaxAge": 99
}
},
{
"Type": "PersonChecker",
"Options": {
"MinAge": 15,
"MaxAge": 20
}
}
]
}
}
Startup.cs
public void ConfigureServices(IServiceCollection services)
{
services.Configure<FeaturesOptions>(Configuration.GetSection("DynamicConfig"));
ServiceProvider serviceProvider = services.BuildServiceProvider();
// try to load settings in strongly typed way
var options = serviceProvider.GetRequiredService<IOptions<FeaturesOptions>>().Value;
}
其他定义
public enum FeatureType
{
FileSizeChecker,
PersonChecker
}
public class FeaturesOptions
{
public FeatureConfig[] Features { get; set; }
}
public class FeatureConfig
{
public FeatureType Type { get; set; }
// cannot read polymorphic object
// public object Options { get; set; }
}
public class FileSizeCheckerOptions
{
public int MaxFileSize { get; set; }
}
public class PersonCheckerOption
{
public int MinAge { get; set; }
public int MaxAge { get; set; }
}
【问题讨论】:
-
只做
"FileSizeCheckerOptions": { "MaxFileSize": 1000 }会有缺点吗? -
@ScottHannen 它不会。我需要读取一种特性(
FileSizeChecker)——这是工厂创建新特性的关键。我需要为此功能加载选项。 -
您找到解决方案了吗?
-
@HariPachuveetil 我认为没有简单的解决方案。这是由 .Core 加载机制引起的,其中所有值都被视为键值对,因此没有多态空间。
标签: c# json asp.net-core polymorphism json-deserialization