2011-07-25 19 views
1

2つのサービス(AとB)が両方ともISomeServiceとして登録されているとします。また、将来これらのサービスの1つが必要なクラスが必要になるとします。しかし、クラス名はまだ分かりません。私が知っているのは、指定されたインターフェイスまたは抽象クラスを実装していることです(指定されたインターフェイスを実装するすべてのクラスはISomeServiceの同じインスタンスを必要とします)。どのようにしてこの解決策が起こるか確認できますか?コンストラクタパラメータ属性に基づいてautofacとの依存関係を解決する

Here is a related question where the name of the class which uses the resolved service is known. 私のケースでは、クラス名CustomerRepositoryの名前は先に知られていません。インタフェースの名前(IUserRepositoryやIFunctionRepositoryなど)または抽象クラスのみがわかります。言い換えれば、私はちょうどそのことを知っています SomeRepository:IUserRepositoryとそのIUserRepositoryタイプはA.が必要です。私はユーザーがIUserRepositoryを実装するより多くのクラスを書くことを許可しなければなりません。

ここに質問をするより良い方法があります。 私が取得するために、すべてのIFunctionRepositoryのコンストラクタを必要とする(ここで、ISomeService)と、すべてのIUserRepositoryコンストラクタはBを取得する(ここで、B:ISomeService)

答えて

2

質問あなた自身に尋ねるべきであるが、次のとおりです。使用する際にコンテナが知ることができますどのようにどの実装?追加情報がなければ、コンテナはこれを知ることができません。

また、ISomeServiceのいくつかの実装では、クライアントは常に複数のインスタンスを処理する必要がありますか?

通常、私はIUserRepositoryのようなサービスはいつでも1つの実装しか持たないと思います。もちろん、実装を1つ取り除いて別の実装を使用することもできますが、クライアントクラスは複数ではなく1つのインスタンスしか必要としません。

実際にコンテナに同じインターフェイスの実装が複数含まれている場合は、クライアントクラスが複数のインスタンスを受け入れるか、少なくとも使用する実装を知るためのメタデータが必要です。

クライアントがAutofacで複数のインスタンスを受け入れるのは、IEnumerable<ISomeService>に依存するのと同じくらい簡単で、コンテナはすべてのインスタンスを渡します。クライアントクラスがどのインスタンスを使用するかについていくつかの賢明な決定を行う必要がある場合は、メタデータを使用して登録を増やす必要があります。関係する質問は、クラス自体の形で何らかのメタデータを使用します。より良い方法は、おそらくより分離された形式のメタデータを使用することです。これがAutofacでどのように実装されているかについては、hereを参照してください。

+0

希少な返信をありがとう – ada

+0

@ada - ありがとう!まれ? :)うまくいけばそれは役に立つと思う。もしそうなら、私の答えを受け入れたものとしてマークしてください。 –

+0

私は、質問を一目瞭然に見ていても気にする人はほとんどいないということを意味しました。 :) – ada

関連する問題