如何通过反射批量注册泛型接口实现类到DI容器
自动注册泛型接口实现类到DI容器的实现方案
核心逻辑是通过反射扫描程序集,匹配实现了目标泛型接口的可实例化类,逐个完成服务注册,不需要手动写每一条注册语句。
实现步骤
- 定义
IServiceCollection的扩展方法,方便在启动阶段调用 - 筛选需要扫描的程序集,避免无意义扫描系统框架程序集损耗性能
- 遍历程序集中所有非抽象、公开的可实例化类
- 检查每个类实现的接口,提取出所有
IMyInterface<T>的闭包泛型类型 - 按照指定生命周期将服务类型与实现类型配对注册到DI容器
完整代码
using System.Reflection; using Microsoft.Extensions.DependencyInjection; public static class ServiceCollectionExtensions { public static IServiceCollection RegisterAllMyInterfaceImplementations( this IServiceCollection services, params Assembly[] assembliesToScan) { // 未手动指定扫描程序集时,默认扫描当前应用域加载的非系统类业务程序集 if (assembliesToScan == null || assembliesToScan.Length == 0) { assembliesToScan = AppDomain.CurrentDomain.GetAssemblies() .Where(asm => !asm.IsDynamic && !asm.FullName.StartsWith("Microsoft.") && !asm.FullName.StartsWith("System.")) .ToArray(); } // 目标泛型接口的开放类型定义 var targetOpenInterface = typeof(IMyInterface<>); foreach (var assembly in assembliesToScan) { // 筛选当前程序集下所有可实例化的公开类 var implTypes = assembly.GetTypes() .Where(t => t.IsClass && t.IsPublic && !t.IsAbstract); foreach (var implType in implTypes) { // 找到当前类实现的所有闭包形式的IMyInterface<T> var matchedServiceTypes = implType.GetInterfaces() .Where(i => i.IsGenericType && i.GetGenericTypeDefinition() == targetOpenInterface); foreach (var serviceType in matchedServiceTypes) { // 注册服务,这里默认用Transient生命周期,可按需替换为AddScoped/AddSingleton services.AddTransient(serviceType, implType); } } } return services; } }
调用方式
在应用启动的服务配置阶段调用扩展方法即可:
// .NET 6+ 顶级语句写法 Program.cs var builder = WebApplication.CreateBuilder(args); // 自动注册所有实现类,也可手动传入指定程序集:typeof(Program).Assembly builder.Services.RegisterAllMyInterfaceImplementations(); // 旧版Startup类写法 public void ConfigureServices(IServiceCollection services) { services.RegisterAllMyInterfaceImplementations(); }
注意事项
- 如果业务类集中在固定几个程序集,建议手动传入目标程序集,比全量扫描性能更好,也能避免误注册无关类型
- 可以根据业务需要调整注册生命周期,替换
AddTransient为对应方法即可 - 如果需要排除特定实现类,可以在筛选
implTypes的逻辑中增加判断规则,比如通过自定义Attribute标记不需要注册的类 - 单个实现类如果实现了多个不同泛型参数的
IMyInterface<T>,上述逻辑会自动完成所有配对的注册,无需额外处理
内容的提问来源于stack exchange,提问作者Roy Berris
相关产品推荐
相关产品推荐

