10

一部のDIフレームワークがこれをサポートしていることは知っていますが(Ninjectなど)、Autofacで可能かどうかを具体的に知りたいと思います。

Autofacコンテナーに具象クラスを要求し、その具象クラスを登録せずに、適切なコンストラクター依存関係がすべて注入されたインスタンスを取得できるようにしたいと思います。つまり、明示的にバインドしない場合は、呼び出した場合と同じように、具象クラスをそれ自体に自動的にバインドします。builder.Register<MyClass>();

これが役立つ場合の良い例は、ViewModelsです。MVVMでは、ビューのみがViewModelに依存し、ルーズタイピングを介してレイヤー化され、ビューの単体テストは行われません。したがって、テストのためにViewModelをモックする必要はありません。したがって、各ViewModelのインターフェイスを用意する必要はありません。したがって、この場合、「このクラスに解決するためにこのインターフェースを登録する」という通常のDIパターンは、不必要な複雑さではありません。のような明示的な自己バインドbuilder.Register<MyClass>();も、具象クラスのように単純なものを扱う場合、不要なステップのように感じます。

Autofacドキュメントのリフレクションベースの登録例を知っていますが、それも私の好みではありません。考えられるすべてのクラスを事前に登録することの複雑さ(および遅さ)は望んでいません。フレームワークが必要なときに必要なものを提供してくれるようにしたい。設定より規約など。

Autofacを設定して、「これは具体的なタイプで、まだ誰も登録していないので、デフォルト設定で登録されたように動作します」と表示されるようにする方法はありますか?

4

2 に答える 2

14
builder.RegisterTypesMatching(type => type.IsClass)

ソースを見ると、RegisterTypesMatching(およびRegisterTypesFromAssembly)が反射を行っていないことがわかります。この場合、Autofacが実行しているのは、タイプを受け入れるかどうかを受け入れるルールを登録することだけです。上記の私の例では、クラスであるすべてのタイプを受け入れます。

RegisterTypesFromAssemblyの場合、Autofacは、「解決しようとしているタイプのAssembly ==が指定されたアセンブリである場合、インスタンスを提供します」というルールを登録します。

それで:

  1. 登録時にタイプの反映は行われません。
  2. 基準に一致するタイプはすべて解決されます

具体的な型を直接登録する場合と比較すると、Autofacはコンストラクターの要件などを把握する必要があるため、解決時にパフォーマンスが低下します。とは言うものの、デフォルトのインスタンススコープ(シングルトン)を使用する場合、そのタイプを最初に解決するときにのみヒットします。次回は、作成済みのシングルトンインスタンスを使用します。

更新: Autofac 2には、コンテナーが何でも解決できるようにするためのより良い方法があります。これにはAnyConcreteTypeNotAlreadyRegistered登録ソースが含まれます。

于 2009-07-20T16:06:01.417 に答える
2

どうですか:

builder.RegisterTypesFromAssembly(Assembly.GetExecutingAssembly());

Peter Lillevold が指摘しているように、リフレクションは行われません。

于 2009-07-15T22:16:29.713 に答える