IoC[1] - Dependency Injection

Zanim omówimy czym jest IoC i jak będę go używał, zacznijmy od tego czym jest Dependency Injection. Głównie chodzi o to, żeby rozdzielić implementacje poszczególnych klas. Załóżmy, że mamy taki kod:

class A {...}
    
class B
{
    private A myA;
    public B()
    {
        myA = new A();
    }
}

Nasza klasa B jest w pełni zależna od klasy A. Lepszym rozwiązaniem byłoby napisać interfejs IA, który będzie zawierał sygnaturę publicznych metod A (dlaczego jeszcze warto używać interfejsów?) i A będzie go implementowało. Dzięki temu, jeśli kiedyś stwierdzimy, że chcemy inną implementację IA, będziemy mogli ją bez problemu utworzyć. Natomiast klasa B potrzebuje jedynie informacji o interfejsie IA, a nie o jego implementacji.

No dobra, ale gdzie tu jest Dependency Injection? Otóż to wstrzykiwanie zależności polega na tym, że przekazujemy obiekt implementujący IA do konstruktora B i ten nie musi się martwić tworzeniem nowego obiektu.

Otrzymujemy coś takiego:

interface IA {...}
class A {...}
    
class B
{
    private IA myIA;
    public B(IA iA)
    {
        myIA = iA;
    }
}

Następnie w kodzie naszej aplikacji wywołamy

var b = new B(new A); //lub inna implementacja

I na tym głównie polega DI. Korzyści z niego płynące są bardziej widoczne przy dużych projektach, ale warto stosować to również w mniejszych projektach, aby zrobić sobie właściwe nawyki.