Sto appena iniziando a conoscere IoC e Dipendenza iniezione. Sto pensando di fare un progetto MonoTouch e volevo usare TinyIoC ma volevo provarlo prima. Sto creando una fittizia app per la gestione delle carte di credito e sto avendo problemi con la configurazione di TinyIoC poiché ho implementazioni multiple della mia interfaccia. Questa è la mia app di prova.TinyIoC - Implementazioni multiple di interfaccia
Interfaccia:
public interface IPaymentProcessor
{
void ProcessPayment(string cardNumber);
}
due implementazioni dell'interfaccia:
VisaPaymentProcessor
public class VisaPaymentProcessor : IPaymentProcessor
{
public void ProcessPayment(string cardNumber)
{
if (cardNumber.Length != 13 && cardNumber.Length != 16)
{
new ArgumentException("Card Number isn't the correct length");
}
// some code for processing payment
}
}
AmexPaymentProcessor
public class AmexPaymentProcessor : IPaymentProcessor
{
public void ProcessPayment(string cardNumber)
{
if (cardNumber.Length != 15)
{
new ArgumentException("Card Number isn't the correct length");
}
// some code for processing the payment
}
}
Semplice. Ora ho una classe che accetta l'interfaccia come parametro nel costruttore ....
CreditCardProcessor
public class CreditCardProcessor
{
public IPaymentProcessor PaymentProcessor { get; set; }
public CreditCardProcessor(IPaymentProcessor processor)
{
this.PaymentProcessor = processor;
}
public void ProcessPayment(string creditCardNumber)
{
this.PaymentProcessor.ProcessPayment(creditCardNumber);
}
}
mia console app si presenta così ....
class Program
{
static void Main(string[] args)
{
TinyIoCContainer.Current.AutoRegister();
var creditCardProcessor = TinyIoCContainer.Current.Resolve<CreditCardProcessor>();
creditCardProcessor.ProcessPayment("123456789"); // 16 digits
}
}
Quindi sto cercando di capire come dire allo Resolve
quale implementazione dell'interfaccia passare al costruttore. Se eseguo questo codice, utilizzerò sempre l'implementazione VisaPaymentProcessor
.
Quindi, come posso fare a TinyIoC passare l'implementazione AmexPaymentProcessor
al costruttore piuttosto che allo VisaPaymentProcessor
(che sembra essere l'impostazione predefinita)?
Grazie. Ho aggiornato il post con la domanda. Sembra che VisaPaymentProcessor sia l'implementazione "predefinita" utilizzata da TinyIoC. Come posso ottenere che TinyIoC passi l'implementazione 'AmexPaymentProcessor' al costruttore. Mi dispiace per non essere chiaro. –
@ Eclipsed4utoo: Okay - in tal caso, mi aspetto che la mia risposta lo copra :) –
@JonSkeet si scusa per la mia mancanza di comprensione, ma come si risolve questo problema originale degli OP? Sembra che voglia essere in grado di risolvere condizionalmente le dipendenze registrate in fase di runtime. –