Rya*_*ord 8 c# dependency-injection tinyioc
我刚刚开始学习IoC和依赖注入.我打算做一个MonoTouch项目,想要使用TinyIoC,但我想先测试一下.我正在创建一个虚拟信用卡处理控制台应用程序,我遇到了如何配置TinyIoC的问题,因为我有多个接口实现.这是我的测试应用.
界面:
public interface IPaymentProcessor
{
void ProcessPayment(string cardNumber);
}
Run Code Online (Sandbox Code Playgroud)
界面的两个实现:
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
}
}
Run Code Online (Sandbox Code Playgroud)
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
}
}
Run Code Online (Sandbox Code Playgroud)
简单的东西.现在我有一个类接受接口作为构造函数中的参数....
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);
}
}
Run Code Online (Sandbox Code Playgroud)
我的控制台应用看起来像这样....
class Program
{
static void Main(string[] args)
{
TinyIoCContainer.Current.AutoRegister();
var creditCardProcessor = TinyIoCContainer.Current.Resolve<CreditCardProcessor>();
creditCardProcessor.ProcessPayment("1234567890123456"); // 16 digits
}
}
Run Code Online (Sandbox Code Playgroud)
所以我试图弄清楚如何告诉Resolve接口的哪个实现传递给构造函数.如果我运行此代码,我将始终使用该VisaPaymentProcessor实现.
那么我怎样才能让TinyIoC将AmexPaymentProcessor实现传递给构造函数而不是VisaPaymentProcessor(这似乎是默认的)?
我自己没有使用过TinyIoC,但我怀疑你想要:
TinyIoCContainer.Current.Register(typeof(IPaymentProcessor),
typeof(AmexPaymentProcessor));
Run Code Online (Sandbox Code Playgroud)
(如果你想使用美国运通卡.)
还有其他各种Register可用的重载,包括一个需要使用名称的重载,这在您解决时可能很有用.这实际上取决于你想要达到的目标,这个问题并不十分清楚.