Ядро Asp.net. Сконфигурируйте метод IOptions с помощью параметров типа (не универсальных)
Есть ли способ вызвать метод 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
уровень.
Есть ли идея?
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;
}
}