Search code examples
c#inversion-of-control

Examples of IoC Containers


Does anyone have good examples of IoC containers (preferably in c#) and how and why to use them ? I have checked out the wiki page and Ayende's example, but I don't quite get the concept yet.

And when and where should I use an IoC container ?


Solution

  • I've used StructureMap quite a bit. The rest of your question is pretty loaded. I'll try to explain the concept in an example.

    Suppose you created a website that will accept payments through PayPal. PayPal is now a dependency. But you don't want to code against a specific PayPal provider.

    Instead, you would create and code against an interface like this:

    interface IPaymentProcessor
    {
        bool ProcessPayment(amount, ....);
    }
    

    All your PayPal code would reside in a class that implements the methods of your interface - PayPalPaymentProcessor, for example.

    Now you have an object that you will actually use to process the payments. This could be a Controller (ASP.NET-MVC, ViewModel-WPF) or just a class as shown here:

    class PaymentProcessor
    {
        private IPaymentProcessor _processor = null;
        public PaymentProcessor(IPaymentProcessor processor)
        {
            _processor = processor;
        }
    
        public bool ProcessTransaction(Transaction trans)
        {
           _processor.ProcessPayment(trans.amount, ...);
        }
    }
    

    This is where an IoC container comes in. Instead of you calling the constructor manually, you would let an IoC container inject the dependency:

    PaymentProcessor processor = ObjectFactory.GetInstance<PaymentProcessor>();
    

    This piece of code tells StructureMap "Anytime you see a constructor that needs an IPaymentProcessor, return a new PayPalPaymentProcessor".

    ObjectFactory.Initialize(x =>
    { 
        x.ForRequestedType<IPaymentProcessor>().TheDefaultIsConcreteType<PayPalPaymentProcessor>();
    });
    

    All this mapping is separate from your implementation code and you could swap out these at a later point with little refactoring needed. There is a lot more to IoC containers, but that the basic concept. You can automate the injection of constructors to avoid the calls directly to ObjectFactory as well.

    Hope this helps!