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

.NET Core依赖注入中如何注册多类型参数的泛型类型

.NET Core 3.1 内置DI注册双泛型参数类型的实现方式

.NET Core 内置DI容器原生支持多泛型参数的开放泛型注册,逻辑和单泛型参数注册完全一致,无需引入第三方DI框架。

开放泛型全匹配注册

如果要让容器对所有IDataPump<TSourceData, TTargetData>的解析请求,都自动返回对应泛型参数的DataPump<TSourceData, TTargetData>实例,使用接收Type参数的注册重载即可:

public void ConfigureServices(IServiceCollection services)
{
    // 注册双参数开放泛型,生命周期可按需选择AddTransient/AddScoped/AddSingleton
    services.AddScoped(typeof(IDataPump<,>), typeof(DataPump<,>));
    
    // 单参数泛型注册逻辑不受影响
    services.AddScoped(typeof(IDataSource<>), typeof(ConcreteDataSource<>));
    services.AddScoped(typeof(IDataTarget<>), typeof(ConcreteDataTarget<>));
}

注意:声明开放泛型类型时,N个泛型参数需要在尖括号中写N-1个逗号,比如3个泛型参数写typeof(IGeneric<,,>),漏写逗号会导致类型匹配失败。

特定封闭泛型组合注册

如果你只需要注册固定的泛型类型组合,或者不同泛型组合需要对应不同实现,直接使用普通泛型注册重载即可,和非泛型服务注册没有区别:

// 注册固定泛型组合的默认实现
services.AddTransient<IDataPump<User, UserArchive>, DataPump<User, UserArchive>>();

// 特定泛型组合指定自定义实现
services.AddScoped<IDataPump<Order, OrderSyncLog>, CustomOrderSyncPump>();

补充说明

  • 代码中定义的泛型约束(where T : class)不需要在注册阶段做特殊处理,容器会在解析具体封闭类型时自动校验约束合法性,不满足约束时直接抛出异常。
  • 开放泛型无法使用AddScoped<TInterface, TImpl>()这类泛型语法重载,因为C#不允许将未绑定类型参数的开放泛型作为泛型参数传入,必须走Type传参的重载。
  • 无论泛型参数数量是多少,开放泛型的注册规则都完全一致,仅尖括号内的逗号数量随参数个数变化。

内容的提问来源于stack exchange,提问作者balintn

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 16:42:51