2016-06-16 15 views
0

キーを使用して提供サービスのすべてのタイプを解決する方法はありますか?そのキーは何度か使用されていますか?これは依存性注入のためのものではありません。 私が達成したいのは、グループコンポーネントであり、グループ内のそれらのコンポーネントのリストを取得します。例えば、私はインターフェイス
を持っている:Castle Windsor ResolveAll複数のコンポーネントのキーを使用

interface ICommand 
{ 
    void Execute(); 
} 

私はそれぞれの目的は、複数の実装を持つことになると私はそれぞれの目的のためのインタフェースを作成したくない、いくつかの目的のために、このインターフェイスを使用したいが、私がしたいです、このICommandインターフェイスを使用します。
私は以下のような何かを行うことができるようにしたい:

ICommand[] commands = container.ResolveAll<ICommand>("purpose1"); 
ICommand[] commands2 = container.ResolveAll<ICommand>("purpose2"); 

上記は登録が既に行われている前提としています。 誰でもこれを行う方法について考えていますか?
Castle Windsorは依存性注入を行うことを目的としていますが、私はこの目的のために役立つことを知っていますが、これは自然にMEFを使用して行うことができますが、一部のコンポーネントは依存性があります。 ありがとうございます。

+1

「ICommand」ではなく「ICommand []」を登録してみませんか? –

+0

あなたが示唆するようにできるようにするためには、単一の場所ですべてのコンポーネントを単一の目的のために知る必要があります@yacoub – arturomonriv

+0

おかげで@YacoubMassad – arturomonriv

答えて

1

キー名を与えることは、コンテナの下にある同じサービスの複数の実装とは区別されます。

おそらく、実装が属するグループの名前を保持できるプロパティをサービスで定義できます。

interface ICommand 
{ 
    void Execute(); 
    string GroupName { get; } 
} 

class CommandImpl1 : ICommand 
{ 
    void Execute() { ... } 
    string GroupName { get { return "group1"; } 
} 

class CommandImpl2 : ICommand 
{ 
    void Execute() { ... } 
    string GroupName { get { return "group1"; } 
} 

次にあなたが登録することができます:

Container.Register<ICommand, CommandImpl1>("a"); 
Container.Register<ICommand, CommandImpl2>("b"); 

をそして、あなたが探しているグループのすべてを引っ張っ:

IEnumerable<ICommand> allCommands = Container.ResolveAll<ICommand>(); 
IEnumerable<ICommand> group1Commands = allCommands 
    .Where(cmds => cmds.GroupName.Equals("group1")); 

あなたは以下のような何かを行うことができUnityContainerを使用して

それをテストしていないが、それはうまくいくと思う。別のアプローチは、実装されたサービスで注釈を使用することです。

乾杯!

+0

このアプローチの最大の問題は、インタフェースが受け入れられないプロパティ@erickpimienta – arturomonriv

関連する問題