You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过反射批量注册泛型接口实现类到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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.01 18:54:32