Castle Windsor - Wie man benannte Instanz in der Konstruktorinjektion abbildet

8

vielleicht ist das einfach, aber die Suche im Internet bereitet mir schon Kopfschmerzen.

Hier ist das Problem:

%Vor%

Irgendeine Idee?

BEARBEITEN

Ich habe ValidatorA und ValidatorB mit Named registriert, jetzt ist das Problem, wie Castle Windsor diese Validierer richtig in ClassA und ClassB injizieren kann, gibt es eine Möglichkeit, das zu tun? oder gibt es eine bessere Lösung?

Wenn jemand denkt, dass mein Klassendesign falsch ist, dann bitte ich um Rat. Bisher halte ich es für richtig. Ja, der Validator hat spezifische Konfigurationen für bestimmte Klassen. aber es gibt Gründe, warum es abstrahiert ist:

  1. Der Validator ist ein komplexes Objekt, sollte sich irgendwann mit der Datenbank verbinden, daher MUSS ich die Schnittstelle anstelle der Implementierung an den Konstruktor für Unit-Test-Grund übergeben.
  2. Keine Möglichkeit, eine andere Schnittstelle für einen Validator zu verwenden, da die einzige Methode, die ich verwendet habe, Validate ist
  3. Ich denke, MyBaseClass.Validate() eine gemeinsame Vorlage Methode Muster, nicht wahr?
ktutnik 04.07.2012, 08:56
quelle

2 Antworten

9

Ohne auf die Details Ihrer gewählten Architektur einzugehen, konzentrieren Sie sich nur auf die Windsor Container-Konfiguration:

Wenn Sie mehrere benannte Implementierungen für eine bestimmte Schnittstelle registriert haben ( IValidator ), können Sie angeben, welche für die Registrierung der Consumer-Klassen ( ClassA , ClassB ) mit ServiceOverrides verwendet werden soll:

Die folgenden Containerkonfigurationsanbieter haben eine OtherClass mit ClassA Instanz mit einer ValidatorA und ClassB Instanz mit einem ValidatorB :

%Vor%     
nemesv 04.07.2012, 15:10
quelle
1

Scheint, dass Sie versuchen, enge Paare ( ClassA mit ValidatorA , ClassB mit ValidatorB ) als unabhängige Typen in einen gemeinsamen Container zu setzen. Das ist sinnlos. Wenn Sie sich auf eine enge Kopplung wie diese verlassen müssen, vergessen Sie die Abhängigkeitsinjektion in dieser Hinsicht und verweisen Sie nur auf die Typen.

Dies wäre sinnvoller, wenn Sie einen gemeinsamen Validator für alle Klassen implementieren könnten. Machen Sie zum Beispiel die Klassen für die Bereitstellung von Validierungsregeln verantwortlich und lassen Sie Validator Erzwinge einfach die Regeln. Oder fügen Sie einfach die gesamte Validierung in Ihre Klassen ein, was wahrscheinlich das sinnvollste Szenario ist.

MyBaseClass.Validate() sehen aus wie eine Inversion der Kontrolle, aber nicht wie eine Template-Methode.

    
Jacek Gorgoń 04.07.2012 12:04
quelle

Tags und Links