1

この例を見てください:

Bind(typeof(IRepository<>)).To(typeof(Repository<>));

これは NInject に有効であり、私の質問は、これが乱用/アンチパターンであるかどうかです。

これに関する問題は、タイプ IRepository<> のメンバー/パラメーター変数を持つことができないため、このバインディングのインスタンスを持つ唯一の方法は、Type 要求を持つファクトリを使用することです。すなわち

_kernel.Get(typeof(IRepository<>));

探索する可能性のある手段の 1 つは、ダイナミクスの使用です。

public Foo(IRepository<dynamic> repository)
{}

少なくともここでは、制御の反転に準拠する、注入されるコンストラクター引数があります。

オープンジェネリックについて私が尋ねた別の質問のために、私は上記を尋ねています。この文脈では、次の...

public Foo(IEnumerable<IRepository<dynamic>> allRepoInstancesInjected)

...可能なはずのようです。

4

1 に答える 1

5

オープンジェネリックバインディングがどのように機能するかを誤解していると思います。

オープンジェネリックを解決することはできません_kernel.Get(typeof(IRepository<>));。これは例外をスローするだけです。考えられるすべてのクローズドジェネリックの列挙型も取得できません。それとも、何がIEnumerable<IList<T>>戻ってくると思いますか?IList地球上で実装された、そしてこれから実装されるすべてのクラスと組み合わせて列挙できますか?

それらを使用して、適切に指定されたクローズドジェネリックを取得できます。たとえば、アプリケーションで使用されるすべてのクローズドジェネリックを次のように定義する代わりに:

Bind(typeof(IRepository<Foo>)).To(typeof(Repository<Foo>));
Bind(typeof(IRepository<Bar>)).To(typeof(Repository<Bar>));
Bind(typeof(IRepository<Baz>)).To(typeof(Repository<Baz>));

一度定義するだけです

Bind(typeof(IRepository<>)).To(typeof(Repository<>));

そして、それらを閉じた一般的な依存関係として取得できます

ctor(IRepository<Foo> fooRepository)

DIに関してアンチパターンであるものは何も見当たりません。ジェネリックリポジトリがアンチパターンであるかどうかは別の質問ですが、この質問の一部ではありません。

そして、オープンジェネリックのダイナミクスを取得することは確かに機能します

ctor(IRepository<dynamic> dynamicRepository)
于 2013-02-28T21:17:19.330 に答える