0 Вопрос: Как загрузить полиморфные объекты в appsettings.json

вопрос создан в Thu, May 2, 2019 12:00 AM

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

}
    
1
  1. Есть ли обратная сторона в простом выполнении "FileSizeCheckerOptions": { "MaxFileSize": 1000 }?
    2019-05-02 14: 57: 39Z
  2. @ ScottHannen Не будет. Мне нужно прочитать тип функции (FileSizeChecker) - это ключ для фабрики по созданию новой функции. И мне нужно загрузить параметры для этой функции.
    2019-05-02 15: 00: 48Z
0 ответов                              0                         
источник размещен Вот