TinyIoC - 接口的多种实现

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(这似乎是默认的)?

Jon*_*eet 7

我自己没有使用过TinyIoC,但我怀疑你想要:

TinyIoCContainer.Current.Register(typeof(IPaymentProcessor),
                                  typeof(AmexPaymentProcessor));
Run Code Online (Sandbox Code Playgroud)

(如果你想使用美国运通卡.)

还有其他各种Register可用的重载,包括一个需要使用名称的重载,这在您解决时可能很有用.这实际上取决于你想要达到的目标,这个问题并不十分清楚.