Есть ли способ как прочитать полиморфные объекты из appsettings.json строго типизированным способом? Ниже приведен очень простой пример того, что мне нужно.
У меня есть несколько компонентов приложения с именем Features
здесь. Эти компоненты создаются во время выполнения фабрикой. Мой замысел заключается в том, что каждый компонент настраивается с помощью отдельных строго типизированных параметров. В этом примере FileSizeCheckerOptions
и PersonCheckerOption
являются их экземплярами. Каждая функция может быть включена несколько раз с различной опцией.
Но с существующей системой конфигурации Asp.Net Core я не могу читать полиморфные строго типизированные параметры. Если настройки будут считываться десериализатором Json, я мог бы использовать что-то вроде этого . Но это не тот случай 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; }
}