.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
相关产品推荐
相关产品推荐

