Ядро Asp.net. Сконфигурируйте метод IOptions с помощью параметров типа (не универсальных) - PullRequest
0 голосов
/ 01 ноября 2018

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

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

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 level.

Есть идея?

1 Ответ

0 голосов
/ 20 ноября 2018

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

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;
    }
}
...