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
zero_x | <span style="font-size: 10;">my</span><span style="font-size: 10;">CSharp</span><span style="font-size: 10;">.de</span> - gemeinsam mehr erreichen
Für längere Zeit inaktiv.
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?
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.
Hallo ihr Beiden,
vielen Dank für eure Hilfe!
zero_x
zero_x | <span style="font-size: 10;">my</span><span style="font-size: 10;">CSharp</span><span style="font-size: 10;">.de</span> - gemeinsam mehr erreichen
Für längere Zeit inaktiv.
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