如何用Ninject绑定开放泛型接口到同闭包类型的开放泛型实现
在Ninject中绑定带类型约束的开放泛型接口与实现
嘿,我来帮你搞定这个Ninject里的开放泛型绑定问题!先结合你的场景捋清楚:你有带继承约束的开放泛型接口IInterface<TClassA, TClassB>,还有对应的实现类IterfaceImplementation<TClassA, TClassB>,泛型参数分别限定为BaseA和BaseB的子类,而且基类本身没实现接口。
其实Ninject对这种带约束的开放泛型支持得很到位,你不需要额外做什么复杂操作,直接绑定开放泛型类型就行,它会自动尊重你在接口和实现里定义的泛型约束。
具体绑定步骤
首先,创建一个Ninject模块(就是继承NinjectModule的类),在Load方法里添加绑定代码:
public class MyAppModule : NinjectModule { public override void Load() { // 核心绑定:把开放泛型接口指向对应的开放泛型实现 Bind(typeof(IInterface<,>)).To(typeof(IterfaceImplementation<,>)); } }
验证绑定是否正常工作
当你需要获取具体闭包类型的实例时,比如IInterface<A, B>,Ninject会自动匹配到IterfaceImplementation<A, B>——因为A继承BaseA、B继承BaseB,完全符合泛型约束:
// 初始化Ninject内核并加载模块 var kernel = new StandardKernel(new MyAppModule()); // 获取具体类型的实例 var myService = kernel.Get<IInterface<A, B>>(); // 可以验证一下实例类型是否正确 Debug.Assert(myService is IterfaceImplementation<A, B>);
小提醒
- 确保你的
IterfaceImplementation<TClassA, TClassB>有可被Ninject解析的构造函数——要么是无参构造,要么构造函数里的依赖也已经在Ninject中完成了绑定。 - 如果之后有多个实现类对应同一个开放泛型接口,可以用
Named或者WithMetadata来区分不同绑定,但你的场景里应该只用这一个就够了。
这样就完成了绑定,Ninject会自动处理所有满足约束的泛型参数组合,帮你正确解析对应的实现类~
内容的提问来源于stack exchange,提问作者veili_13
相关产品推荐
相关产品推荐

