Laden...

Service Locator und Dependency Injection Container: Was sind die Unterschiede? Wann was verwenden?

Erstellt von zero_x vor 13 Jahren Letzter Beitrag vor 13 Jahren 3.094 Views
zero_x Themenstarter:in
1.044 Beiträge seit 2008
vor 13 Jahren
Service Locator und Dependency Injection Container: Was sind die Unterschiede? Wann was verwenden?

Hallo zusammen,

Dependency Injection und Service Locator haben das selbe Ziel: das lösen von Abhängigkeiten. Doch wo ist der Unterschied zwischen den beiden Techniken? Wann soll man einen Service Locator und wann einen Dependency Injection Container verwenden? Beim MVVM-Pattern habe ich noch nie gesehen, dass dort Dependency Injection verwendet wird. Warum nicht? Wo sind die Unterschiede zwischen Dependency Injection und Service Locator?

zero_x

5.742 Beiträge seit 2007
vor 13 Jahren

Hallo zero_x,

zunächst einmal: Die beiden Techniken sind nicht konkurrierend, sondern ergänzen sich.

Sowohl der ServiceLocator als auch DI-Container fallen in den Bereich der Dependency-Injection bzw. IoC.

Grob gesagt:
Ein ServiceLocator liefert etwas, was im Normalfall über die gesamte Lebensdauer einer Anwendung existiert (z.B. ein CustomerRepository oder gerade bei deinem Beispiel einen DialogService).
Im Normalfall gilt also:


Object.ReferenceEquals(serviceLocator.Resolve<IMyService>(), serviceLocator.Resolve<IMyService>());

Hingegen liefert ein Dependency-Injection-Container im Normalfall neue Objekte bzw. stattet neu erzeugte mit den benötigten Abhängigkeiten aus. Dabei wird häufig ein konkreter Typ anhand eines Interfaces erzeugt:


ICustomer = container.Create<ICustomer>(); //liefert jedes Mal einen neuen Customer

So viel jedenfalls zur Theorie.
In den meisten Fällen übernimmt eine gemeinsame Komponente die Aufgabe beide.
Siehe hierzu auch meine Gedanken in [IoC] Strengere Trennung zwischen ServiceLocator und DI-Container?

T
381 Beiträge seit 2009
vor 13 Jahren

Im Wesentlichen muss der DI-Container ja nur Singletons unterstüzen und schon kann er beides. So hab ich es vor kurzem realisiert.


ICustomer = container.Create<ICustomer>();

Wenn etwas erstellt werden soll und Abhängigkeiten hat, dann werden die Abhängigkeiten über Properties vom vorher Konfigurierten DI-Container gesetzt? Oder holen sich die erzeugten Objekte (hier der ICustomer) dann einfach ihre Abhängigkeiten aus dem container?

Edit: Ich sehe grade das diese Frage auch in deinem anderen Post auftaucht und hier wohl keine größere Disskusion bedarf.

zero_x Themenstarter:in
1.044 Beiträge seit 2008
vor 13 Jahren

Hallo ihr Beiden,

vielen Dank für eure Hilfe!

zero_x

5.941 Beiträge seit 2005
vor 13 Jahren

Hallo zusammen

@Tarion & winSharp93
Service Locator oder Dependency Injection unterscheidet sich nicht durch Singleton oder nicht Singleton.
Die Unterscheidung liegt in der Anwendung, Service Locator explizit und Dependency Injection implizit.

@All

Golo hat das gut beschrieben:

Gruss Peter

--
Microsoft MVP - Visual Developer ASP / ASP.NET, Switzerland 2007 - 2011