2

有没有办法使用非通用参数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);
}

所以,最终我不会在例子DALWeb API级别之间有很强的依赖关系。

有什么想法吗?

4

1 回答 1

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;
    }
}
于 2018-11-20T19:56:20.090 回答