2011-08-25 9 views
13

私はAutofacを使って自分のアプリケーションで依存関係を処理しています。しかし、実行時にリフレクションマジックを実行するコンポーネントが1つあり、コンパイル時に必要な依存関係はわかりません。サービスロケータとしてのAutofacの使用

通常、このコンポーネントはコンテナを直接参照し、必要なものを解決します。ただし、このクラスをインスタンス化しているクラスには、コンテナへの参照はありません。

私のコンポーネントは効果的に、Autofacに依存しています。私はより緩やかなカップリングを好むだろうが、それはここではオプションではないようだ。私のコンストラクタ内のコンテナへの参照を私に与えるためにAutofac(コンストラクタの引数で、またはプロパティインジェクションを使用するなど)を求める方法はありますか?または、Autofacに何かを解決できる魔法のサービスロケータオブジェクトを私に提供させるためのクリーンな方法はありますか?

+2

コンポーネントが何をしているのかを知ることは面白いでしょう。おそらく、サービスロケータのパターン以外の方法があります。いくつかのコードで更新できますか? –

+0

私はそれをかなりよく説明することができます。メッセージはバスを介して受信されるので、コードはメッセージが何らかのメタデータを使用しているかを判断し、前記タイプを構築する。次に、Autofacを使用して 'IConsume '(ここで 'type'はメタデータの型です)のすべての実装者を見つけて、その上でConsumeメソッドを呼び出す必要があります。 –

+0

あなたは次のような意味を持っています:http://kozmic.pl/2010/03/11/advanced-castle-windsor-ndash-generic-typed-factories-auto-release-and-more/ –

答えて

12

はい、できます。ただ、IComponentContextへの依存を取る:コメントから

public class MyComponent 
{ 
    IComponentContext _context; 
    public MyComponent(IComponentContext context) 
    { 
     _context = context; 
    } 

    public void DoStuff() 
    { 
     var service = _context.Resolve(...); 
    } 
} 

アップデート:MyComponentに注入IComponentContextMyComponentが解決された範囲に依存します。したがって、どのような生涯範囲MyComponentが登録されているかを検討することが重要です。例えば。 InstancePerLifetimeScopeを使用すると、コンテキストは常にMyComponentに依存するサービスと同じスコープに解決されます。

+0

これは複数のライフタイムスコープで動作しますか?つまり、IComponentContextは基本コンテナかスコープですか? –

+3

'IComponentContext'を' MyComponent'が解決されたスコープから解決します。したがって、 'MyComponent'が' InstancePerLifetimeScope'として登録されている場合、 'context'は常に期待されるスコープから解決されます。 –

+0

完璧な、ちょうど私が必要なもの。 –

1

あなたはAがそれを使用する前に、BについてXを知っておく必要がある場合、これはメタデータの尋問で、それはこのexcellent記事で説明された二つの成分、AとB

を持っていると仮定すると。

あなたのデザインをその投稿に適用できない場合でも、実際にDIコンテナをサービスロケータとして使用する必要があるかどうかを再度確認する必要があります。

この記事の執筆時点で、私が見つけたと思う最高のブログ記事はthisです。

+0

私の質問には全く関係しないもので、すでによく答えられた質問になぜ答えるのか分かりません...私が言ったように、私は解決する必要がある "B"実行時まで –

+1

@NikosBaxevanis +1、OPがそれを得るように見えなかったとしても。どちらの投稿も優れています。Nicholasポストのこの単一のフレーズはすべてを再開します:「同時に、あなたのコンポーネントでIContainerまたはIComponentContextを使用する理由はほとんどありません。 – rsenna

0

DIを使用してコンポーネントを作成しない場合でも、サービスロケータパターンを使用できます。 CodePlexのCommon Service Locatorライブラリは、目的には最適です。

関連する問題