Я только начинаю изучать IoC и внедрение зависимостей. Я планирую сделать проект MonoTouch и хотел использовать TinyIoC, но сначала хотел его протестировать. Я создаю фиктивное консольное приложение для обработки кредитных карт, и у меня возникают проблемы с настройкой TinyIoC, поскольку у меня есть несколько реализаций моего интерфейса. Это мое тестовое приложение.
Интерфейс:
public interface IPaymentProcessor
{
void ProcessPayment(string cardNumber);
}
Две реализации интерфейса:
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
}
}
Простые вещи. Теперь у меня есть класс, который принимает интерфейс в качестве параметра в конструкторе....
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);
}
}
Мое консольное приложение выглядит так....
class Program
{
static void Main(string[] args)
{
TinyIoCContainer.Current.AutoRegister();
var creditCardProcessor = TinyIoCContainer.Current.Resolve<CreditCardProcessor>();
creditCardProcessor.ProcessPayment("1234567890123456"); // 16 digits
}
}
Итак, я пытаюсь понять, как сообщить Resolve
какую реализацию интерфейса передать конструктору. Если я запущу этот код,Я всегда буду использовать реализацию VisaPaymentProcessor
.
Итак, как я могу заставить TinyIoC передать в конструктор реализацию AmexPaymentProcessor
, а не VisaPaymentProcessor
(, которая по умолчанию )?