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?
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.
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>
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%Tags und Links c# dependency-injection tinyioc