Estoy empezando a aprender sobre la IoC y la Inyección de Dependencia. Estoy planeando hacer un proyecto MonoTouch y quería usar TinyIoC, pero quería probarlo primero. Estoy creando una aplicación de consola de procesamiento de tarjetas de crédito y estoy teniendo problemas con la configuración de TinyIoC ya que tengo varias implementaciones de mi interfaz. Esta es mi aplicación de prueba.TinyIoC - Implementaciones Múltiples de la Interfaz
Interface:
public interface IPaymentProcessor
{
void ProcessPayment(string cardNumber);
}
dos implementaciones de la interfaz:
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
}
}
Cosas simples. Ahora tengo una clase que acepta la interfaz como parámetro en el constructor ....
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);
}
}
Mi aplicación de consola se parece a esto ....
class Program
{
static void Main(string[] args)
{
TinyIoCContainer.Current.AutoRegister();
var creditCardProcessor = TinyIoCContainer.Current.Resolve<CreditCardProcessor>();
creditCardProcessor.ProcessPayment("123456789"); // 16 digits
}
}
Así que estoy tratando de averiguar cómo decirle al Resolve
qué implementación de la interfaz debe pasar al constructor. Si ejecuto este código, siempre usaré la implementación VisaPaymentProcessor
.
Entonces, ¿cómo puedo hacer que TinyIoC pase la implementación AmexPaymentProcessor
al constructor en lugar del VisaPaymentProcessor
(que parece ser el predeterminado)?
Gracias. Actualicé la publicación con la pregunta. Parece que 'VisaPaymentProcessor' es la implementación" predeterminada "que utiliza TinyIoC. ¿Cómo puedo hacer que TinyIoC pase la implementación de 'AmexPaymentProcessor' al constructor en su lugar. Perdón por no ser claro. –
@ Eclipsed4utoo: Bien - en ese caso, esperaría que mi respuesta lo cubriera :) –
@JonSkeet se disculpa por mi falta de comprensión, pero ¿cómo soluciona esto el problema original de los PO? Parece que quieren poder resolver condicionalmente las dependencias registradas en tiempo de ejecución. –