如何用Ninject自动绑定程序集中继承泛型基类的所有类
解决Ninject自动绑定泛型基类实现的接口问题
这个场景我太熟悉了——手动维护几百个绑定确实会让人头大!别担心,我们可以通过反射+Ninject的API来实现全自动绑定,完全不用一个个写kernel.Bind。下面是亲测可行的方案:
核心思路
我们需要:
- 找出所有继承自
BasePlatformClass<T>的具体非泛型类 - 为每个类确定对应的
IPlatform<T>接口(T就是基类的泛型参数) - 调用Ninject的绑定API完成映射
具体实现代码
把这段代码放到你的Ninject模块的Load方法里即可:
public class PlatformModule : NinjectModule { public override void Load() { // 1. 获取包含你的具体类的程序集(根据实际情况调整,多个程序集可遍历) var targetAssembly = typeof(ConcreteClassForA).Assembly; // 2. 筛选符合条件的具体类 var concretePlatformClasses = targetAssembly.GetTypes() .Where(type => !type.IsAbstract && !type.IsGenericTypeDefinition // 排除抽象类和泛型定义类 && type.BaseType != null && type.BaseType.IsGenericType // 基类是泛型类型 && type.BaseType.GetGenericTypeDefinition() == typeof(BasePlatformClass<>)); // 基类匹配BasePlatformClass<> // 3. 遍历每个类,自动绑定到对应的IPlatform<T> foreach (var concreteType in concretePlatformClasses) { // 获取基类的泛型参数(比如ContractA、ContractB) var genericContractType = concreteType.BaseType.GetGenericArguments()[0]; // 构建对应的IPlatform<T>接口类型 var targetInterface = typeof(IPlatform<>).MakeGenericType(genericContractType); // 执行绑定:将具体类绑定到目标接口 Bind(targetInterface).To(concreteType); } } }
关键细节说明
- 程序集获取:如果你的
ConcreteClassForX分散在多个程序集里,可以改成遍历所有加载的程序集,或者手动指定多个目标程序集。 - 类型筛选逻辑:确保只处理非抽象的具体类,避免泛型定义类(比如
BasePlatformClass<T>本身)被误处理。 - 绑定逻辑:每个具体类都会被绑定到它对应的
IPlatform<T>接口,效果和你手动写kernel.Bind<IPlatform<ContractA>>().To<ConcreteClassForA>()完全一致。
验证方法
你可以在代码里快速验证:
var platformA = kernel.Get<IPlatform<ContractA>>(); Console.WriteLine(platformA.GetType().Name); // 应该输出ConcreteClassForA
内容的提问来源于stack exchange,提问作者Mirza
相关产品推荐
相关产品推荐

