Oba wzorce wydają się implementacją zasady inwersji kontroli. Oznacza to, że obiekt nie powinien wiedzieć, jak skonstruować swoje zależności.
Dependency Injection (DI) wydaje się używać konstruktora lub setera do „wstrzykiwania” swoich zależności.
Przykład użycia wtrysku konstruktora:
//Foo Needs an IBar
public class Foo
{
private IBar bar;
public Foo(IBar bar)
{
this.bar = bar;
}
//...
}
Lokalizator usług wydaje się używać „kontenera”, który łączy jego zależności i daje mu pasek.
Przykład użycia lokalizatora usług:
//Foo Needs an IBar
public class Foo
{
private IBar bar;
public Foo()
{
this.bar = Container.Get<IBar>();
}
//...
}
Ponieważ nasze zależności są same obiektami, zależności te mają zależności, które mają jeszcze więcej zależności, i tak dalej. Tak narodziła się inwersja kontenera kontrolnego (lub kontenera DI). Przykłady: Zamek Windsor, Ninject, Mapa struktury, Wiosna itp.)
Ale kontener IOC / DI wygląda dokładnie jak lokalizator usług. Czy nazywanie go kontenerem DI to zła nazwa? Czy kontener IOC / DI to kolejny rodzaj lokalizatora usług? Czy niuans polega na tym, że używamy kontenerów DI głównie wtedy, gdy mamy wiele zależności?