2009-07-09 14 views
9

私はいくつかのDIフレームワークがこれをサポートしていることを知っています(例えばNinject)、具体的にはAutofacで可能かどうかを知りたいと思います。オートファックで自動バインドを実行できますか?

私は、具体的なクラスのAutofacコンテナを要求し、適切なコンストラクタの依存関係をすべて注入したインスタンスを取得したいと思っています。具体的なクラスを登録することなく私は明示的にバインドすることはありません場合、私はこれがあるのviewmodels有用であろうときの良い例builder.Register<MyClass>();

と呼ばれていたかのように、すなわち、その後、は自動的に、それ自体に具象クラスをバインド。 MVVMでは、ViewのみがViewModelに依存し、緩いタイピングではViewが単体テストしないようなレイヤーになっています。したがって、テストのためにViewModelをモックする必要はありません。したがって、各ViewModelのインタフェースを持つ理由はありません。したがって、この場合、「このクラスに解決するためにこのインタフェースを登録する」という通常のDIパターンは、不要な複雑さです。 builder.Register<MyClass>();のような明示的な自己バインディングも、具体的なクラスと同じように扱うときには不要なステップのように感じます。

私はAutofacドキュメントのreflection-based registration exampleを知っていますが、これは私の好みではありません。私は、すべての可能なクラスを事前に登録することの複雑さ(および遅さ)を望んでいません。フレームワークが必要なときに必要なものを私に与えることを望みます。コンベンションのコンベンション、そしてそのすべて。

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

答えて

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

あなたはRegisterTypesMatching(およびRegisterTypesFromAssembly)は、任意の反射をやっていないされていることがわかりますlook at the source場合。この場合、Autofacはタイプを受け入れるルールを登録しているかどうかを確認しています。上の私の例では、クラスであるすべての型を受け入れます。

RegisterTypesFromAssemblyの場合、Autofacは「解決しようとしている型がAssembly ==指定されたアセンブリであれば、インスタンスを与えます」という規則を登録します。

  1. は全くタイプの反射が基準に一致するすべてのタイプは、直接この意志を具体的なタイプを登録するために比較

を解決されるレジスタ時間

  • で行われていない。だから、

    Autofacは解決する必要がありますので、解決時間にperfヒットしてくださいコンストラクタ要件。つまり、シングルトンである既定のインスタンススコープを使用する場合は、最初にその型を解決するときだけヒットします。次回はすでに作成されたシングルトンインスタンスを使用します。

    Autofac 2のアップデート:には、コンテナを何かを解決するためのより良い方法があります。これにはthe AnyConcreteTypeNotAlreadyRegistered registration sourceが含まれます。

  • +0

    Sweet - 私が探していたものとまったく同じように聞こえる。ありがとう! –

    2

    かについて:

    builder.RegisterTypesFromAssembly(Assembly.GetExecutingAssembly()); 
    

    全く反射がピーターLillevold points outとして、行われません。

    +1

    あなたが正しいと思ったので私の前のコメントを削除しました。あなたの編集で明らかになったように:RegisterTypesFromAssemblyはその名前が示唆するように大規模なリフレクションを行いません。これはRegisterTypesMatchingの略語関数のファミリーの1つであり、私が探しているものと全く同じですが、きめ細かい制御があり、かなり甘いです。あなたの答えを誤解して初めて私の謝罪。 –

    +0

    あなたが与えたリンクは壊れています... – Guillaume

    +1

    私を許してください。しかし、この答えは3歳です:P他にも、それ以来オートファクトにはたくさんのことが起こっています。私はもうこれ以上関係はないと思います。 –

    関連する問題