获取 Ninject 中继承泛型约束的所有类型

Get all types that inherit generic constraint in Ninject

我有泛型 IMyGeneric<T> where T : IBase.

如何让所有类型继承 ninject 中的 IMyGeneric<T>

我试过这个:

this.kernel.GetAll<IMyGeneric<IBase>>();

但这不起作用,它的 returning 0 结果。

我可以获得所有继承 IBase 的所有内容,然后 foreach 所有类型并使用 this.kernel.Get(type) 但是我会得到 IEnumerable<object> 而不是 IEnumerable<IMyGeneric<IMyInheritedType>>并且将无法将 return 转换为特定类型,例如IEnumerable<IMyGeneric<IBase>> 因为我在转换时出错。

Ninject 只支持注入专门注册的类型。除了两个例外:

  1. 如果请求的类型是可实例化的(例如,当您请求 FooClass 并且 FooClass 包含可访问的构造函数时)。
  2. 打开泛型绑定(你有一个封闭的泛型,所以它在这里没有帮助)

意味着如果你想解决几个IMyGeneric<IBase>你需要注册几个:

Bind<Apple>().To<IMyGeneric<IBase>>();
Bind<Pear>().To<IMyGeneric<IBase>>();

或者,如果这些类型需要由多种类型解析:

Bind(typeof(Apple)).To(typeof(IMyGeneric<IBase>), typeof(IMyGeneric<Apple>));

您可以使用 Conventions Extension and use a custom IBindingGenerator 创建绑定,而不是手动定义所有绑定。 或者当然您也可以编写自己的基于反射的助手。