获取 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 只支持注入专门注册的类型。除了两个例外:
- 如果请求的类型是可实例化的(例如,当您请求
FooClass
并且 FooClass
包含可访问的构造函数时)。
- 打开泛型绑定(你有一个封闭的泛型,所以它在这里没有帮助)
意味着如果你想解决几个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
创建绑定,而不是手动定义所有绑定。
或者当然您也可以编写自己的基于反射的助手。
我有泛型 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 只支持注入专门注册的类型。除了两个例外:
- 如果请求的类型是可实例化的(例如,当您请求
FooClass
并且FooClass
包含可访问的构造函数时)。 - 打开泛型绑定(你有一个封闭的泛型,所以它在这里没有帮助)
意味着如果你想解决几个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
创建绑定,而不是手动定义所有绑定。
或者当然您也可以编写自己的基于反射的助手。