TinyIoC - Mehrere Implementierungen der Schnittstelle

8

Ich fange gerade an, über IoC und Dependency Injection zu lernen. Ich plane ein MonoTouch-Projekt und wollte TinyIoC verwenden, aber ich wollte es zuerst testen. Ich erstelle eine Dummy-App für die Kreditkarten-Bearbeitungskonsole, und ich habe Probleme mit der Konfiguration von TinyIoC, da ich mehrere Implementierungen meiner Schnittstelle habe. Dies ist meine Test App.

Schnittstelle :

%Vor%

Zwei Implementierungen der Schnittstelle:

VisaPaymentProcessor

%Vor%

AmexPaymentProcessor

%Vor%

Einfaches Zeug. Jetzt habe ich eine Klasse, die die Schnittstelle als Parameter im Konstruktor akzeptiert ....

CreditCardProcessor

%Vor%

Meine Konsolen-App sieht so aus ...

%Vor%

Ich versuche also herauszufinden, wie man der Resolve angibt, welche Implementierung der Schnittstelle an den Konstruktor übergeben werden soll. Wenn ich diesen Code ausführe, verwende ich immer die VisaPaymentProcessor -Implementierung.

Wie kann ich TinyIoC dazu bringen, die AmexPaymentProcessor -Implementierung an den Konstruktor und nicht an die VisaPaymentProcessor (die standardmäßig zu sein scheint) zu übergeben?

    
Ryan Alford 02.05.2012, 20:50
quelle

3 Antworten

7

Ich habe TinyIoC nicht selbst benutzt, aber ich vermute, dass Sie wollen:

%Vor%

(Wenn Sie Amex verwenden möchten.)

Es sind verschiedene andere Register Überladungen verfügbar, einschließlich einer, die einen Namen verwendet, was beim Auflösen hilfreich sein kann. Es hängt wirklich davon ab, was Sie erreichen wollen, was in der Frage nicht besonders klar ist.

    
Jon Skeet 02.05.2012 21:00
quelle
2

Ich bin nicht wirklich sicher, was Sie hier erreichen wollen, aber wenn Sie mehrere Implementierungen einer Schnittstelle haben und Sie eine bestimmte wollen, dann müssen Sie jede mit einem Namen registrieren, oder verwenden Sie RegisterMultiple, die verwendet der Typname für einen Namen, dann Auflösung mit diesem Namen und verwenden Sie diese zusammen mit NamedParameterOverloads, um den gewünschten Namen anzugeben.

Es klingt eher so, als ob Sie irgendeine Art von ProcessorFactory oder eine Fassade irgendeiner Art wünschen, die eine Abhängigkeit von IEnumerable benötigt und als eine Fassade für die korrekte Implementierung in Abhängigkeit von der übergebenen Zahl dient. p>     

Steven Robbins 02.05.2012 21:09
quelle
2

So etwas in Global.asax oder Anwendungseintrag (Modifiziert für Ihr Beispiel)

%Vor%

Es findet alle Implementierungen von IPaymentProcessor und registriert sie mit dem Klassennamen (-PaymentProcessor, wenn der Klassenname mit dem PaymentProcessor endet)

Dann kann ich zum Beispiel "AmexPaymentProcessor" mit

auflösen %Vor%     
Kristoffer Schroeder 07.03.2014 23:54
quelle