Beide Muster scheinen eine Umsetzung des Prinzips der Umkehrung der Kontrolle zu sein. Das heißt, dass ein Objekt nicht wissen sollte, wie es seine Abhängigkeiten konstruiert.
Dependency Injection (DI) scheint einen Konstruktor oder Setter zu verwenden, um seine Abhängigkeiten zu "injizieren".
Beispiel für die Verwendung der Konstruktorinjektion:
//Foo Needs an IBar
public class Foo
{
private IBar bar;
public Foo(IBar bar)
{
this.bar = bar;
}
//...
}
Service Locator scheint einen "Container" zu verwenden, der seine Abhängigkeiten verkabelt und foo seine Leiste gibt.
Beispiel für die Verwendung eines Service Locator:
//Foo Needs an IBar
public class Foo
{
private IBar bar;
public Foo()
{
this.bar = Container.Get<IBar>();
}
//...
}
Da unsere Abhängigkeiten nur Objekte selbst sind, haben diese Abhängigkeiten Abhängigkeiten, die noch mehr Abhängigkeiten aufweisen, und so weiter und so fort. So wurde die Inversion des Kontrollcontainers (oder DI-Containers) geboren. Beispiele: Castle Windsor, Ninject, Strukturkarte, Frühling usw.)
Ein IOC / DI-Container sieht jedoch genauso aus wie ein Service Locator. Ist es ein schlechter Name, wenn man es DI-Container nennt? Ist ein IOC / DI-Container nur eine andere Art von Service Locator? Liegt die Nuance in der Tatsache, dass wir DI-Container meistens verwenden, wenn wir viele Abhängigkeiten haben?