2016-09-02 51 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來創建綁定。 或者當然你也可以編寫自己的基於反射的幫手。