Die gängigen Antworten sind nicht hilfreich, da sie die Injektion von Abhängigkeiten auf eine Weise definieren, die nicht sinnvoll ist. Einigen wir uns darauf, dass wir mit "Abhängigkeit" ein bereits existierendes anderes Objekt meinen, das unser Objekt X benötigt. Aber wir sagen nicht, dass wir "dependency injection" machen, wenn wir sagen
$foo = Foo->new($bar);
Wir rufen das einfach auf, indem wir Parameter an den Konstruktor übergeben. Das tun wir regelmäßig, seit Konstruktoren erfunden wurden.
"Dependency Injection" wird als eine Art "Umkehrung der Kontrolle" betrachtet, was bedeutet, dass dem Aufrufer ein Teil der Logik entzogen wird. Das ist nicht der Fall, wenn der Aufrufer Parameter übergibt. Wäre dies also DI, würde DI keine Inversion der Kontrolle bedeuten.
DI bedeutet, dass es eine Zwischenebene zwischen dem Aufrufer und dem Konstruktor gibt, die Abhängigkeiten verwaltet. Ein Makefile ist ein einfaches Beispiel für Dependency Injection. Der "Aufrufer" ist die Person, die "make bar" in die Befehlszeile eingibt, und der "Konstruktor" ist der Compiler. Das Makefile gibt an, dass bar von foo abhängt, und es führt eine
gcc -c foo.cpp; gcc -c bar.cpp
vor der Durchführung einer
gcc foo.o bar.o -o bar
Die Person, die "make bar" eingibt, braucht nicht zu wissen, dass bar von foo abhängt. Die Abhängigkeit wurde zwischen "make bar" und gcc injiziert.
Der Hauptzweck der Zwischenebene ist nicht nur die Übergabe der Abhängigkeiten an den Konstruktor, sondern die Auflistung aller Abhängigkeiten in nur ein Ort und sie vor dem Programmierer zu verbergen (und ihn nicht zu zwingen, sie bereitzustellen).
Normalerweise stellt die Zwischenebene Fabriken für die konstruierten Objekte zur Verfügung, die eine Rolle bereitstellen müssen, die jeder angeforderte Objekttyp erfüllen muss. Der Grund dafür ist, dass man durch eine Zwischenebene, die die Details der Konstruktion verbirgt, bereits den Abstraktionsnachteil von Fabriken in Kauf genommen hat, so dass man genauso gut Fabriken verwenden kann.
0 Stimmen
Siehe meine Diskussion über Dependency Injection Hier .
44 Stimmen
Ich stimme den Kommentaren zu den Links zu. Ich kann verstehen, dass Sie vielleicht auf jemand anderen verweisen wollen. Aber fügen Sie zumindest hinzu, warum Sie sie verlinken und was diesen Link besser macht als die anderen Links, die ich mit Google finden könnte
0 Stimmen
@AR: Technisch gesehen, ist Dependency Injection no eine besondere Form von IoC. Vielmehr ist IoC eine Technik, die zur Bereitstellung von Dependency Injection verwendet wird. Es können auch andere Techniken für die Dependency Injection verwendet werden (obwohl IoC die einzige ist, die häufig verwendet wird), und IoC wird auch für viele andere Probleme verwendet.
157 Stimmen
Was die Links betrifft, so ist zu bedenken, dass sie oft auf die eine oder andere Weise verschwinden. Die Zahl der toten Links in SO-Antworten steigt. Egal, wie gut der verlinkte Artikel ist, er nützt nichts, wenn man ihn nicht finden kann.
0 Stimmen
Vojta Jina über Dependency Injection youtu.be/_OGGsf1ZXMs . Der erste Teil.
0 Stimmen
Ein Überblick über Dependency Injection und ihre Beziehung zu anderen OOP-Prinzipien: deviq.com/dependency-injection
0 Stimmen
Hier ist ein Anwendungsbeispiel ohne DI: tugay.biz/2017/05/standalone-jpa-beispiel-mit-hibernate.html und dasselbe mit DI: tugay.biz/2017/05/add-c3p0-to-previous-example.html