8

IoC と Dependency Injection について学び始めたばかりです。私は MonoTouch プロジェクトを計画しており、TinyIoC を使用したいと考えていましたが、最初にテストしたかったのです。ダミーのクレジット カード処理コンソール アプリを作成していますが、インターフェイスの実装が複数あるため、TinyIoC の構成方法に問題があります。これは私のテストアプリです。

インターフェース:

public interface IPaymentProcessor
{
    void ProcessPayment(string cardNumber);
}

インターフェイスの 2 つの実装:

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
    }
}

シンプルなもの。これで、コンストラクターのパラメーターとしてインターフェイスを受け入れるクラスができました....

クレジット カード プロセッサ

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

4

3 に答える 3

7

私は TinyIoC を自分で使用したことはありませんが、次のことを望んでいると思われます。

TinyIoCContainer.Current.Register(typeof(IPaymentProcessor),
                                  typeof(AmexPaymentProcessor));

(アメックスをご利用の場合)

名前を使用するものなど、他にもさまざまなRegisterオーバーロードが利用可能であり、解決時に役立つ場合があります。それは本当にあなたが達成しようとしていることに依存しますが、それは質問からはあまり明確ではありません.

于 2012-05-02T21:00:55.687 に答える
2

ここで何を達成しようとしているのかよくわかりませんが、インターフェイスの実装が複数あり、特定の実装が必要な場合は、それぞれを名前で登録するか、型名を使用する RegisterMultiple を使用する必要があります名前の場合は、その名前を使用して解決し、それを NamedParameterOverloads と共に使用して、必要なものを指定します。

IEnumerable に依存し、渡された数値に応じて正しい実装のファサードとして供給/機能する、ある種の ProcessorFactory またはある種のファサードが必要なように思えます。

于 2012-05-02T21:09:19.373 に答える