2016-06-16 22 views
0

Gibt es eine Möglichkeit, alle Arten für einen gebenden Dienst mit einem Schlüssel zu lösen und dieser Schlüssel wird mehrmals verwendet? Dies ist nicht für die Abhängigkeitsinjektion gedacht. Was ich erreichen möchte, ist Gruppenkomponenten, und Liste dieser Komponenten in einer Gruppe.
Zum Beispiel habe ich eine Schnittstelle:Castle Windsor ResolveAll mit Schlüssel in mehreren Komponenten

interface ICommand 
{ 
    void Execute(); 
} 

ich diese Schnittstelle für verschiedene Zwecke verwendet werden soll, wird jeder Zweck mehrere Implementierungen haben kann und will ich nicht eine Schnittstelle für jeden Zweck schaffen, möchte ich Verwenden Sie diese ICommand-Schnittstelle.
Ich möchte in der Lage sein, etwas zu tun, wie unten:

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

Above übernimmt Registrierung bereits durchgeführt wurde. Hat jemand eine Idee, wie man das macht?
Ich weiß Castle Windsor soll Dependency Injection zu tun, aber ich fand es hilfreich für diesen Zweck, ich weiß, dass dies mit MEF natürlich getan werden kann, aber einige Komponenten haben Abhängigkeiten, die MEF wie ich weiß nicht injizieren wird. Vielen Dank im Voraus.

+1

Warum registrierst du 'ICommand []' statt 'ICommand'? –

+0

In der Lage zu tun, wie Sie vorschlagen, ich muss an einem Ort alle Komponenten für einen einzigen Zweck wissen, die nicht der Fall sein kann @ yacoub – arturomonriv

+0

BTW danke @ YacoubMassad – arturomonriv

Antwort

1

Wie ich feststellen kann, gibt es einen Schlüsselnamen, um es von mehreren Implementierungen desselben Dienstes unter dem Container zu unterscheiden.

Wahrscheinlich können Sie eine Eigenschaft am Dienst definieren, die den Namen der Gruppe enthalten kann, zu der die Implementierung gehört.

UnityContainer Verwenden Sie etwas wie folgt tun könnte:

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"; } 
} 

Dann können Sie sich registrieren:

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

und ziehen Sie alle für die Gruppe, die Sie suchen:

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

Habe es nicht getestet, aber es sollte funktionieren. Ein anderer Ansatz könnte eine Annotation beim implementierten Service sein.

Prost !!

+0

Größtes Problem mit diesem Ansatz ist, dass ich hinzufügen müsste eine Eigenschaft zu Schnittstelle, die @erickpimienta nicht akzeptabel ist – arturomonriv