2016-09-02 3 views
2

generic型IMyGeneric<T> where T : IBaseがあります。Ninjectの汎用制約を継承するすべての型を取得します。

すべてのタイプを取得するには、どのようにしてIMyGeneric<T>をninjectで継承しますか?

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は、特に登録されている注入タイプのみをサポートしています。 2つの例外で:

  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を使用してバインディングを作成します。 もちろん、自分のリフレクションベースのヘルパーを書くこともできます。

関連する問題