2016-09-02 48 views
2

我有泛型类型IMyGeneric<T> where T : IBase获取在Ninject中继承通用约束的所有类型

如何获取所有类型在ninject中继承IMyGeneric<T>

我尝试这样做:

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

,但不工作及其返回0的结果。

我能得到所继承IBase一切,然后foreach所有类型和使用this.kernel.Get(type)但后来我不得不IEnumerable<object>而不是IEnumerable<IMyGeneric<IMyInheritedType>>和将无法施展,然后返回为特定类型的如IEnumerable<IMyGeneric<IBase>>,因为我在演员时出错。

+0

转换的'IMyGeneric '到'IMyGeneric '当接口被定义为变量类型才会工作:'IMyGeneric ',但即便如此,我不认为Ninject实际上支持此功能。因此,即使您注册了不同类型的“IMyGeneric ”列表,Ninject也可能不会为您获取这些类型。 – Steven

+0

任何其他方式来获取所有基于约束的实现?或者创建IBaseConstraint(仅限于约束),然后通过IBase获取所有内容?虽然我不太喜欢这个想法。 – zhuber

+0

您可能想要更多地展示您为我们提供的有关如何继续操作的反馈的实际实施。 – Steven

回答

1

Ninject只支持特别注册的注射类型。但有两个例外:

  1. 如果请求的类型是instanciatable(例如,当您请求FooClassFooClass包含可访问的构造函数)。
  2. 开放式泛型绑定(你有一个封闭的通用的,所以它不会在这里帮助)

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

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

或如果这些类型需要由多个类型可解析:

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

除了手动定义所有绑定你可以使用的并使用自定义IBindingGenerator来创建绑定。 或者当然你也可以编写自己的基于反射的帮手。