Ядро Asp.net. Сконфигурируйте метод IOptions с помощью параметров типа (не универсальных)

Есть ли способ вызвать метод Configure от IServiceCollectionDI контейнер с не универсальными параметрами?

Я хочу зарегистрировать мой раздел конфигурации не так:

services.Configure<AppSection>(Configuration);

Но так:

services.Configure(typeof(AppSection), Configuration);

Я хочу сделать это, как я хочу передать мои разделы конфигурации List<Type> сбор с низкоуровневых уровней приложений (DAL) до высокого уровня (Web api). А потом сделайте только цикл по этой коллекции с регистрацией каждого раздела.

foreach (var type in LowAppLevelSections)
{
   services.Configure(type, Configuration);
}

Таким образом, в конце концов у меня не будет сильной зависимости, например, между DAL а также Web API уровень.

Есть ли идея?

1 ответ

Вот подход. Все, что вам нужно сделать, это немного почистить его, написать несколько юнит-тестов. (Опять извините за грязный код)

public static class IServicesCollectionExtension
{
    public static IServiceCollection Configure(this IServiceCollection services, Type typeToRegister, IConfiguration service)
    {
        var myMethod = typeof(OptionsConfigurationServiceCollectionExtensions)
          .GetMethods(BindingFlags.Static | BindingFlags.Public)
          .Where(x => x.Name == nameof(OptionsConfigurationServiceCollectionExtensions.Configure) && x.IsGenericMethodDefinition)
          .Where(x => x.GetGenericArguments().Length == 1)
          .Where(x => x.GetParameters().Length == 2)
          .Single();

        MethodInfo generic = myMethod.MakeGenericMethod(typeToRegister);
        generic.Invoke(null, new object[] { services, service });
        return services;
    }
}
Другие вопросы по тегам