Как загрузить полиморфные объекты в appsettings.json - PullRequest
3 голосов
/ 02 мая 2019

Есть ли способ как прочитать полиморфные объекты из 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; }

}
...