Es wurden bereits mehrere Fragen mit spezifischen Fragen zur Abhängigkeitsinjektion gestellt , z. B. wann sie verwendet werden soll und welche Frameworks dafür vorhanden sind. Jedoch,
Was ist Abhängigkeitsinjektion und wann / warum sollte oder sollte sie nicht verwendet werden?
Antworten:
Die Abhängigkeitsinjektion übergibt die Abhängigkeit an andere Objekte oder Frameworks (Abhängigkeitsinjektor).
Die Abhängigkeitsinjektion erleichtert das Testen. Die Injektion kann durch einen Konstruktor erfolgen .
SomeClass()
hat seinen Konstruktor wie folgt:Problem : Wenn
myObject
komplexe Aufgaben wie Festplattenzugriff oder Netzwerkzugriff erforderlich sind , ist es schwierig , einen Komponententest durchzuführenSomeClass()
. Programmierer müssen sich verspottenmyObject
und könnten den Werksaufruf abfangen .Alternative Lösung :
myObject
als Argument an den KonstruktormyObject
kann direkt übergeben werden, was das Testen erleichtert.Es ist schwieriger, Komponenten in Unit-Tests ohne Abhängigkeitsinjektion zu isolieren.
Als ich 2013 diese Antwort schrieb, war dies ein wichtiges Thema im Google Testing Blog . Dies bleibt für mich der größte Vorteil, da Programmierer nicht immer die zusätzliche Flexibilität in ihrem Laufzeitdesign benötigen (z. B. für Service Locator oder ähnliche Muster). Programmierer müssen die Klassen häufig während des Testens isolieren.
quelle
Die beste Definition, die ich bisher gefunden habe, ist eine von James Shore :
Es gibt einen Artikel von Martin Fowler , der sich ebenfalls als nützlich erweisen könnte.
Die Abhängigkeitsinjektion stellt im Wesentlichen die Objekte bereit, die ein Objekt benötigt (seine Abhängigkeiten), anstatt sie selbst erstellen zu lassen. Dies ist eine sehr nützliche Technik zum Testen, da damit Abhängigkeiten verspottet oder ausgeblendet werden können.
Abhängigkeiten können auf viele Arten in Objekte injiziert werden (z. B. Konstruktorinjektion oder Setterinjektion). Man kann sogar spezielle Abhängigkeitsinjektions-Frameworks (z. B. Spring) verwenden, um dies zu tun, aber sie sind sicherlich nicht erforderlich. Sie benötigen diese Frameworks nicht, um eine Abhängigkeitsinjektion durchzuführen. Das explizite Instanziieren und Übergeben von Objekten (Abhängigkeiten) ist eine ebenso gute Injektion wie die Injektion durch das Framework.
quelle
Ich fand dieses lustige Beispiel in Bezug auf lose Kopplung :
Jede Anwendung besteht aus vielen Objekten, die zusammenarbeiten, um einige nützliche Dinge auszuführen. Traditionell ist jedes Objekt dafür verantwortlich, seine eigenen Verweise auf die abhängigen Objekte (Abhängigkeiten) zu erhalten, mit denen es zusammenarbeitet. Dies führt zu stark gekoppelten Klassen und schwer zu testendem Code.
Betrachten Sie zum Beispiel a
Car
Objekt.A
Car
hängt von Rädern, Motor, Kraftstoff, Batterie usw. ab. Traditionell definieren wir die Marke solcher abhängigen Objekte zusammen mit der Definition desCar
Objekts.Ohne Abhängigkeitsinjektion (DI):
Hier ist das
Car
Objekt für die Erstellung der abhängigen Objekte verantwortlich.Was ist, wenn wir den Typ seines abhängigen Objekts - sagen wir
Wheel
- nach den anfänglichenNepaliRubberWheel()
Einstichen ändern möchten ? Wir müssen beispielsweise das Car-Objekt mit seiner neuen Abhängigkeit neu erstellenChineseRubberWheel()
, aber dasCar
kann nur der Hersteller.Was macht das
Dependency Injection
dann für uns ...?Bei Verwendung der Abhängigkeitsinjektion erhalten Objekte ihre Abhängigkeiten zur Laufzeit und nicht zur Kompilierungszeit (Autoherstellungszeit) . Damit wir jetzt das ändern können,
Wheel
wann immer wir wollen. Hier kann dasdependency
(wheel
)Car
zur Laufzeit injiziert werden .Nach Verwendung der Abhängigkeitsinjektion:
Hier injizieren wir die Abhängigkeiten (Rad und Batterie) zur Laufzeit. Daher der Begriff: Abhängigkeitsinjektion.
Quelle: Abhängigkeitsinjektion verstehen
quelle
new
eine Reifen? Ich nicht. Alles was ich tun muss ist bei ihnen zu kaufen (über param injizieren), zu installieren und wah-lah! Zurück zur Programmierung: Wenn ein C # -Projekt eine vorhandene Bibliothek / Klasse verwenden muss, gibt es zwei Möglichkeiten zum Ausführen / Debuggen. 1-Verweis auf das gesamte Projekt hinzufügennew
, Option 2 ist es, es als Parameter zu übergeben. Kann nicht genau sein, aber einfach dumm leicht zu verstehen.Die Abhängigkeitsinjektion ist eine Praxis, bei der Objekte so entworfen werden, dass sie Instanzen der Objekte von anderen Codeteilen empfangen, anstatt sie intern zu erstellen. Dies bedeutet, dass jedes Objekt, das die für das Objekt erforderliche Schnittstelle implementiert, ersetzt werden kann, ohne den Code zu ändern, was das Testen vereinfacht und die Entkopplung verbessert.
Betrachten Sie zum Beispiel diese Klassen:
In diesem Beispiel würde die Implementierung von
PersonService::addManager
undPersonService::removeManager
eine Instanz von benötigenGroupMembershipService
, um ihre Arbeit zu erledigen. Ohne Abhängigkeitsinjektion besteht die traditionelle Methode darin, ein neuesGroupMembershipService
im Konstruktor von zu instanziierenPersonService
und dieses Instanzattribut in beiden Funktionen zu verwenden. Wenn der Konstruktor vonGroupMembershipService
jedoch mehrere Dinge hat, die er benötigt, oder noch schlimmer, gibt es einige Initialisierungs- "Setter", die aufgerufen werden müssenGroupMembershipService
, der Code wächst ziemlich schnell, und dasPersonService
Jetzt hängt nicht nur von dem,GroupMembershipService
sondern auch von allem anderen abGroupMembershipService
kommt drauf an. Darüber hinaus ist die Verknüpfung zu festGroupMembershipService
in das codiert,PersonService
was bedeutet, dass Sie a nicht "blenden" könnenGroupMembershipService
zu Testzwecken oder zur Verwendung eines Strategiemusters in verschiedenen Teilen Ihrer Anwendung.Mit Dependency Injection würden Sie das
GroupMembershipService
in Ihrem Konstruktor übergeben , anstattPersonService
es in Ihrem zu instanziierenPersonService
, oder eine Eigenschaft (Getter und Setter) hinzufügen, um eine lokale Instanz davon festzulegen. Dies bedeutet, dass Sie sichPersonService
keine Gedanken mehr darüber machen müssen, wie Sie eine erstellenGroupMembershipService
, sondern nur die angegebenen akzeptieren und mit ihnen arbeiten. Dies bedeutet auch, dass alles, was eine Unterklasse vonGroupMembershipService
ist oder dieGroupMembershipService
Schnittstelle implementiert, in die Schnittstelle "injiziert" werdenPersonService
kann undPersonService
dass die Änderung nicht bekannt sein muss.quelle
Die akzeptierte Antwort ist gut - aber ich möchte noch hinzufügen, dass DI dem klassischen Vermeiden von hartcodierten Konstanten im Code sehr ähnlich ist.
Wenn Sie eine Konstante wie einen Datenbanknamen verwenden, verschieben Sie diese schnell aus dem Code in eine Konfigurationsdatei und übergeben eine Variable mit diesem Wert an die Stelle, an der sie benötigt wird. Der Grund dafür ist, dass sich diese Konstanten normalerweise häufiger ändern als der Rest des Codes. Zum Beispiel, wenn Sie den Code in einer Testdatenbank testen möchten.
DI ist in der Welt der objektorientierten Programmierung analog dazu. Die Werte dort anstelle von konstanten Literalen sind ganze Objekte - aber der Grund, den Code, der sie erstellt, aus dem Klassencode zu verschieben, ist ähnlich - die Objekte ändern sich häufiger als der Code, der sie verwendet. Ein wichtiger Fall, in dem eine solche Änderung erforderlich ist, sind Tests.
quelle
Versuchen wir ein einfaches Beispiel mit Auto- und Motorklassen. Jedes Auto benötigt einen Motor, um irgendwohin zu fahren, zumindest für den Moment. Also unten, wie Code ohne Abhängigkeitsinjektion aussehen wird.
Und um die Autoklasse zu instanziieren, verwenden wir den nächsten Code:
Das Problem mit diesem Code, das wir eng mit GasEngine verbunden haben, und wenn wir uns entscheiden, ihn in ElectricityEngine zu ändern, müssen wir die Fahrzeugklasse neu schreiben. Und je größer die Anwendung, desto mehr Probleme und Kopfschmerzen müssen wir hinzufügen und neue Motortypen verwenden.
Mit anderen Worten, bei diesem Ansatz ist unsere High-Level-Car-Klasse von der untergeordneten GasEngine-Klasse abhängig, die gegen das Dependency Inversion Principle (DIP) von SOLID verstößt. DIP schlägt vor, dass wir uns auf Abstraktionen verlassen sollten, nicht auf konkrete Klassen. Um dies zu gewährleisten, führen wir die IEngine-Schnittstelle ein und schreiben den Code wie folgt neu:
Jetzt ist unsere Fahrzeugklasse nur noch von der IEngine-Schnittstelle abhängig, nicht von einer bestimmten Implementierung des Motors. Der einzige Trick besteht nun darin, wie wir eine Instanz des Autos erstellen und ihm eine tatsächliche konkrete Motorklasse wie GasEngine oder ElectricityEngine geben. Hier kommt Dependency Injection ins Spiel.
Hier injizieren (übergeben) wir grundsätzlich unsere Abhängigkeit (Engine-Instanz) an den Car-Konstruktor. Jetzt haben unsere Klassen eine lose Kopplung zwischen Objekten und ihren Abhängigkeiten, und wir können problemlos neue Motortypen hinzufügen, ohne die Fahrzeugklasse zu ändern.
Der Hauptvorteil der Abhängigkeitsinjektion besteht darin, dass Klassen lockerer gekoppelt sind, da sie keine fest codierten Abhängigkeiten aufweisen. Dies folgt dem oben erwähnten Prinzip der Abhängigkeitsinversion. Anstatt auf bestimmte Implementierungen zu verweisen, fordern Klassen Abstraktionen (normalerweise Schnittstellen ) an, die ihnen beim Erstellen der Klasse zur Verfügung gestellt werden.
Auch wenn wir viele Abhängigkeiten haben, ist es sehr empfehlenswert, IoC-Container (Inversion of Control) zu verwenden, mit denen wir feststellen können, welche Schnittstellen welchen konkreten Implementierungen für alle unsere Abhängigkeiten zugeordnet werden sollen, und diese Abhängigkeiten beim Erstellen für uns auflösen können unser Objekt. Beispielsweise könnten wir in der Zuordnung für den IoC-Container angeben, dass die IEngine- Abhängigkeit der GasEngine- Klasse zugeordnet werden soll. Wenn wir den IoC-Container nach einer Instanz unserer Car- Klasse fragen , wird unsere Car- Klasse automatisch mit einer GasEngine- Abhängigkeit erstellt übergeben.
UPDATE: Ich habe kürzlich einen Kurs über EF Core von Julie Lerman gesehen und mochte auch ihre kurze Definition über DI.
quelle
Stellen wir uns vor, Sie möchten angeln gehen:
Ohne Abhängigkeitsinjektion müssen Sie sich selbst um alles kümmern. Sie müssen ein Boot finden, eine Angelrute kaufen, nach Ködern suchen usw. Es ist natürlich möglich, aber es bringt viel Verantwortung auf Sie. In Bezug auf die Software bedeutet dies, dass Sie nach all diesen Dingen suchen müssen.
Bei der Abhängigkeitsinjektion kümmert sich jemand anderes um die gesamte Vorbereitung und stellt Ihnen die erforderliche Ausrüstung zur Verfügung. Sie erhalten das Boot, die Angelrute und den Köder - alles einsatzbereit.
quelle
Dies ist die einfachste Erklärung zu Dependency Injection und Dependency Injection Container, die ich je gesehen habe:
Ohne Abhängigkeitsinjektion
Mit Abhängigkeitsinjektion
Verwenden eines Abhängigkeitsinjektionscontainers
Abhängigkeitsinjektion und Abhängigkeitsinjektionsbehälter sind verschiedene Dinge:
Sie benötigen keinen Container, um die Abhängigkeitsinjektion durchzuführen. Ein Container kann Ihnen jedoch helfen.
quelle
Bedeutet "Abhängigkeitsinjektion" nicht nur die Verwendung parametrisierter Konstruktoren und öffentlicher Setter?
James Shores Artikel zeigt die folgenden Beispiele zum Vergleich .
quelle
new DatabaseThingie()
keine gültige myDatabase-Instanz generiert wird.Um das Konzept der Abhängigkeitsinjektion einfach zu verstehen. Nehmen wir ein Beispiel für einen Schalter zum Ein- und Ausschalten einer Glühbirne.
Ohne Abhängigkeitsinjektion
Der Switch muss vorher wissen, an welche Lampe ich angeschlossen bin (fest codierte Abhängigkeit). Damit,
Schalter -> PermanentBulb // Schalter ist direkt mit der permanenten Glühbirne verbunden, ein Testen ist nicht einfach möglich
Mit Abhängigkeitsinjektion
Der Schalter weiß nur, dass ich die Lampe ein- und ausschalten muss, die an mich übergeben wird. Damit,
Schalter -> Bulb1 ODER Bulb2 ODER NightBulb (injizierte Abhängigkeit)
Ändern James Beispiel für Schalter und Leuchtmittel:
quelle
Was ist Abhängigkeitsinjektion (DI)?
Wie bereits erwähnt, entfällt durch Dependency Injection (DI) die Verantwortung für die direkte Erstellung und Verwaltung der Lebensdauer anderer Objektinstanzen, von denen unsere Interessenklasse (Verbraucherklasse) abhängig ist (im UML-Sinne ). Diese Instanzen werden stattdessen an unsere Consumer-Klasse übergeben, normalerweise als Konstruktorparameter oder über Eigenschaftssetter (die Verwaltung der Instanzierung des Abhängigkeitsobjekts und die Übergabe an die Consumer-Klasse erfolgt normalerweise über einen IoC- Container (Inversion of Control) , aber das ist ein anderes Thema). .
DI, DIP und SOLID
Insbesondere in dem Paradigma von Robert C Martin SOLID Prinzipien des Gegenstandes Designorientierte ,
DI
ist eine der möglichen Implementierungen des Dependency Inversion Principle (DIP) . Das DIP ist dasD
desSOLID
Mantras - andere DIP - Implementierungen den Service Locator umfassen, und Plugin - Muster.Ziel des DIP ist es, enge, konkrete Abhängigkeiten zwischen Klassen zu entkoppeln und stattdessen die Kopplung durch eine Abstraktion zu lösen, die über ein
interface
,abstract class
oder erreicht werden kannpure virtual class
in Abhängigkeit von der verwendeten Sprache und Ansatz.Ohne das DIP ist unser Code (ich habe diese "konsumierende Klasse" genannt) direkt an eine konkrete Abhängigkeit gekoppelt und oft mit der Verantwortung belastet, zu wissen, wie eine Instanz dieser Abhängigkeit erhalten und verwaltet wird, dh konzeptionell:
Nach Anwendung des DIP wird die Anforderung gelockert, und die Sorge, die Lebensdauer der
Foo
Abhängigkeit zu ermitteln und zu verwalten, wurde beseitigt:Warum DIP (und DI) verwenden?
Das Entkoppeln von Abhängigkeiten zwischen Klassen auf diese Weise ermöglicht das einfache Ersetzen dieser Abhängigkeitsklassen durch andere Implementierungen, die auch die Voraussetzungen der Abstraktion erfüllen (z. B. kann die Abhängigkeit mit einer anderen Implementierung derselben Schnittstelle ausgetauscht werden). Darüber hinaus, wie andere erwähnt haben, möglicherweise die häufigste Grund für die Entkopplung von Klassen über das DIP darin, dass eine konsumierende Klasse isoliert getestet werden kann, da dieselben Abhängigkeiten jetzt gestoppt und / oder verspottet werden können.
Eine Konsequenz von DI ist, dass die Lebensdauerverwaltung von Abhängigkeitsobjektinstanzen nicht mehr von einer konsumierenden Klasse gesteuert wird, da das Abhängigkeitsobjekt jetzt an die konsumierende Klasse übergeben wird (über Konstruktor- oder Setter-Injection).
Dies kann auf verschiedene Arten betrachtet werden:
Create
im Werk abrufen und diese Instanzen nach Abschluss entsorgen.Wann DI verwenden?
MyDepClass
ist Thread sicher - was ist, wenn wir es zu einem Singleton machen und allen Verbrauchern dieselbe Instanz injizieren?)Beispiel
Hier ist eine einfache C # -Implementierung. Angesichts der folgenden Konsumklasse:
Obwohl es scheinbar harmlos ist, hat es zwei
static
Abhängigkeiten von zwei anderen Klassen,System.DateTime
undSystem.Console
was nicht nur die Protokollierungsausgabeoptionen einschränkt (die Protokollierung an der Konsole ist wertlos, wenn niemand zuschaut), sondern schlimmer noch, es ist schwierig, angesichts der Abhängigkeit von automatisch zu testen eine nicht deterministische Systemuhr.Wir können uns jedoch
DIP
auf diese Klasse beziehen, indem wir das Problem der Zeitstempelung als Abhängigkeit abstrahieren undMyLogger
nur an eine einfache Schnittstelle koppeln:Wir können auch die Abhängigkeit von
Console
einer Abstraktion wie a lösenTextWriter
. Die Abhängigkeitsinjektion wird normalerweise entweder alsconstructor
Injektion (Übergabe einer Abstraktion an eine Abhängigkeit als Parameter an den Konstruktor einer konsumierenden Klasse) oderSetter Injection
(Übergabe der Abhängigkeit über einensetXyz()
Setter oder eine .Net-Eigenschaft mit{set;}
definiert) implementiert . Die Konstruktorinjektion wird bevorzugt, da dies garantiert, dass sich die Klasse nach der Erstellung in einem korrekten Zustand befindet und die internen Abhängigkeitsfelder alsreadonly
(C #) oderfinal
(Java) markiert werden können . Wenn wir also die Konstruktorinjektion für das obige Beispiel verwenden, haben wir Folgendes:(Es
Clock
muss ein Beton bereitgestellt werden, auf den natürlich zurückgegriffen werden kannDateTime.Now
, und die beiden Abhängigkeiten müssen von einem IoC-Container über eine Konstruktorinjektion bereitgestellt werden.)Es kann ein automatisierter Komponententest erstellt werden, der definitiv beweist, dass unser Logger ordnungsgemäß funktioniert, da wir jetzt die Kontrolle über die Abhängigkeiten - die Zeit - haben und die schriftliche Ausgabe ausspionieren können:
Nächste Schritte
Die Abhängigkeitsinjektion ist ausnahmslos mit einem Inversion of Control-Container (IoC) verbunden , um die konkreten Abhängigkeitsinstanzen zu injizieren (bereitzustellen) und Lebensdauerinstanzen zu verwalten. Während des Konfigurations- / Bootstrapping-Prozesses können in
IoC
Containern folgende Elemente definiert werden:IBar
, eineConcreteBar
Instanz zurückgibt" )IDisposable
und übernehmen die Verantwortung fürDisposing
Abhängigkeiten gemäß der konfigurierten Lebensdauerverwaltung.Sobald IoC-Container konfiguriert / gebootet wurden, arbeiten sie normalerweise nahtlos im Hintergrund, sodass sich der Codierer auf den jeweiligen Code konzentrieren kann, anstatt sich um Abhängigkeiten zu kümmern.
Wie im obigen Beispiel erfordert das Entkoppeln von Abhängigkeiten einen gewissen Entwurfsaufwand, und für den Entwickler ist ein Paradigmenwechsel erforderlich, um die Gewohnheit,
new
Abhängigkeiten direkt zu ändern, aufzuheben und stattdessen dem Container zu vertrauen, um Abhängigkeiten zu verwalten.Es gibt jedoch viele Vorteile, insbesondere in der Möglichkeit, Ihre Interessenklasse gründlich zu testen.
Hinweis : Die Erstellung / Zuordnung / Projektion (über
new ..()
) von POCO / POJO / Serialisierungs-DTOs / Entitätsdiagrammen / anonymen JSON-Projektionen ua - dh "Nur Daten" -Klassen oder Datensätze -, die von Methoden verwendet oder zurückgegeben werden, gelten nicht als Abhängigkeiten (in der UML-Sinn) und nicht DI unterworfen. Das Projizierennew
ist in Ordnung.quelle
Bei Dependency Injection (DI) geht es darum, den Quellcode der Anwendung sauber und stabil zu halten :
Praktisch trennt jedes Entwurfsmuster Bedenken, damit zukünftige Änderungen die Mindestdateien beeinflussen.
Die spezifische Domäne von DI ist die Delegierung der Abhängigkeitskonfiguration und -initialisierung.
Beispiel: DI mit Shell-Skript
Wenn Sie gelegentlich außerhalb von Java arbeiten, erinnern Sie sich daran, wie
source
häufig in vielen Skriptsprachen (Shell, Tcl usw. oder sogarimport
in Python, das für diesen Zweck missbraucht wird) verwendet wird.Betrachten Sie ein einfaches
dependent.sh
Skript:Das Skript ist abhängig: Es wird alleine nicht erfolgreich ausgeführt (
archive_files
ist nicht definiert).Sie definieren
archive_files
imarchive_files_zip.sh
Implementierungsskript (zip
in diesem Fall):Anstatt das
source
Implementierungsskript direkt im abhängigen zu verwenden, verwenden Sie eineninjector.sh
"Container", der beide "Komponenten" umschließt:Die
archive_files
Abhängigkeit wird gerade injiziert in abhängige Skript.Sie könnten eine Abhängigkeit injiziert haben, die die
archive_files
Verwendung vontar
oder implementiertxz
.Beispiel: Entfernen von DI
Wenn das
dependent.sh
Skript Abhängigkeiten direkt verwendet, wird der Ansatz als Abhängigkeitssuche bezeichnet (was der Abhängigkeitsinjektion entgegengesetzt ist ):Das Problem ist nun, dass die abhängige "Komponente" die Initialisierung selbst durchführen muss.
Der Quellcode der "Komponente" ist weder sauber noch stabil, da jede Änderung bei der Initialisierung von Abhängigkeiten eine neue Version auch für die Quellcodedatei der "Komponente" erfordert.
Letzte Worte
DI wird nicht so stark betont und populär gemacht wie in Java-Frameworks.
Aber es ist ein generischer Ansatz, um Bedenken aufzuteilen:
Konfiguration nur mit Abhängigkeitssuche verwenden hilft nicht, da sich die Anzahl der Konfigurationsparameter pro Abhängigkeit ändern kann (z. B. neuer Authentifizierungstyp) sowie die Anzahl der unterstützten Arten von Abhängigkeiten (z. B. neuer Datenbanktyp).
quelle
Alle oben genannten Antworten sind gut. Mein Ziel ist es, das Konzept auf einfache Weise zu erklären, damit jeder ohne Programmierkenntnisse auch das Konzept verstehen kann
Die Abhängigkeitsinjektion ist eines der Entwurfsmuster, mit denen wir komplexe Systeme auf einfachere Weise erstellen können.
Wir können eine Vielzahl von Anwendungen dieses Musters in unserem täglichen Leben sehen. Einige Beispiele sind Kassettenrekorder, VCD, CD-Laufwerk usw.
Das obige Bild ist ein Bild eines tragbaren Tonbandgeräts von Rolle zu Rolle, Mitte des 20. Jahrhunderts. Quelle .
Die Hauptabsicht eines Tonbandgeräts besteht darin, Ton aufzunehmen oder wiederzugeben.
Beim Entwerfen eines Systems ist eine Rolle erforderlich, um Ton oder Musik aufzunehmen oder wiederzugeben. Es gibt zwei Möglichkeiten, dieses System zu entwerfen
Wenn wir die erste verwenden, müssen wir die Maschine öffnen, um die Rolle zu wechseln. Wenn wir uns für die zweite entscheiden, bei der ein Haken für die Rolle platziert wird, erhalten wir einen zusätzlichen Vorteil beim Abspielen von Musik, indem wir die Rolle wechseln. und auch die Funktion nur auf das Spielen von irgendetwas auf der Rolle reduzieren.
Ebenso wie die weise Abhängigkeitsinjektion ist der Prozess der Externalisierung der Abhängigkeiten, um sich nur auf die spezifische Funktionalität der Komponente zu konzentrieren, so dass unabhängige Komponenten miteinander verbunden werden können, um ein komplexes System zu bilden.
Die Hauptvorteile, die wir durch die Verwendung der Abhängigkeitsinjektion erzielt haben.
Heute bildet dieses Konzept die Grundlage für bekannte Frameworks in der Programmierwelt. Der Spring Angular usw. sind die bekannten Software-Frameworks, die auf diesem Konzept aufbauen
Die Abhängigkeitsinjektion ist ein Muster, das zum Erstellen von Instanzen von Objekten verwendet wird, auf die sich andere Objekte stützen, ohne zur Kompilierungszeit zu wissen, welche Klasse verwendet wird, um diese Funktionalität bereitzustellen, oder einfach die Art und Weise, wie Eigenschaften in ein Objekt eingefügt werden, als Abhängigkeitsinjektion bezeichnet wird.
Beispiel für die Abhängigkeitsinjektion
Zuvor haben wir Code wie diesen geschrieben
Mit der Abhängigkeitsinjektion nimmt der Abhängigkeitsinjektor die Instanziierung für uns ab
Sie können auch lesen
Unterschied zwischen Inversion der Kontrolle und Abhängigkeitsinjektion
quelle
Was ist Abhängigkeitsinjektion?
Dependency Injection (DI) bedeutet, die voneinander abhängigen Objekte zu entkoppeln. Angenommen, Objekt A ist von Objekt B abhängig, daher besteht die Idee darin, diese Objekte voneinander zu entkoppeln. Wir müssen das Objekt nicht mit einem neuen Schlüsselwort fest codieren, sondern müssen zur Laufzeit trotz Kompilierungszeit Abhängigkeiten mit Objekten teilen. Wenn wir darüber reden
So funktioniert Dependency Injection im Frühjahr:
Wir müssen das Objekt nicht mit einem neuen Schlüsselwort fest codieren, sondern müssen die Bean-Abhängigkeit in der Konfigurationsdatei definieren. Der Federbehälter ist für das Anschließen aller verantwortlich.
Inversion der Kontrolle (IOC)
IOC ist ein allgemeines Konzept und kann auf viele verschiedene Arten ausgedrückt werden. Die Abhängigkeitsinjektion ist ein konkretes Beispiel für IOC.
Zwei Arten der Abhängigkeitsinjektion:
1. Konstruktorbasierte Abhängigkeitsinjektion:
Konstruktorbasiertes DI wird erreicht, wenn der Container einen Klassenkonstruktor mit einer Reihe von Argumenten aufruft, die jeweils eine Abhängigkeit von einer anderen Klasse darstellen.
2. Setter-basierte Abhängigkeitsinjektion:
Setter-basierte DI wird durch den Container erreicht, der Setter-Methoden für Ihre Beans aufruft, nachdem ein Konstruktor ohne Argumente oder eine statische Factory-Methode ohne Argumente aufgerufen wurde, um Ihre Bean zu instanziieren.
ANMERKUNG: Es ist eine gute Faustregel, Konstruktorargumente für obligatorische Abhängigkeiten und Setter für optionale Abhängigkeiten zu verwenden. Beachten Sie, dass die, wenn wir eine Annotation verwenden, die auf der Annotation @Required für einen Setter basiert, verwendet werden kann, um Setter als erforderliche Abhängigkeiten zu erstellen.
quelle
Die beste Analogie, die ich mir vorstellen kann, ist der Chirurg und seine Assistenten in einem Operationssaal, wo der Chirurg die Hauptperson und sein Assistent ist, der die verschiedenen chirurgischen Komponenten bereitstellt, wenn er sie benötigt, damit sich der Chirurg auf die eine konzentrieren kann was er am besten kann (Operation). Ohne den Assistenten muss der Chirurg die Komponenten jedes Mal selbst besorgen, wenn er eine benötigt.
Kurz gesagt, DI ist eine Technik, mit der eine gemeinsame zusätzliche Verantwortung (Belastung) für Komponenten zum Abrufen der abhängigen Komponenten beseitigt wird, indem diese bereitgestellt werden.
DI bringt Sie dem Prinzip der Einzelverantwortung (Single Responsibility, SR) näher, wie dem
surgeon who can concentrate on surgery
.Verwendung von DI: Ich würde die Verwendung von DI in fast allen Produktionsprojekten (klein / groß) empfehlen, insbesondere in sich ständig ändernden Geschäftsumgebungen :)
Warum: Weil Sie möchten, dass Ihr Code leicht testbar, verspottbar usw. ist, damit Sie Ihre Änderungen schnell testen und auf den Markt bringen können. Außerdem, warum sollten Sie nicht, wenn es viele tolle kostenlose Tools / Frameworks gibt, die Sie auf Ihrem Weg zu einer Codebasis unterstützen, auf der Sie mehr Kontrolle haben.
quelle
Beispiel, wir haben 2 Klassen
Client
undService
.Client
wird benutzenService
Ohne Abhängigkeitsinjektion
Weg 1)
Weg 2)
Weg 3)
1) 2) 3) Verwenden
Vorteile
Nachteile
Client
TestklasseService
Konstruktor ändern , müssen wir den Code an allen Stellen ändern, an denen dasService
Objekt erstellt wirdVerwenden Sie die Abhängigkeitsinjektion
Weg 1) Konstruktorinjektion
Verwenden von
Weg 2) Setter-Injektion
Verwenden von
Weg 3) Schnittstelleninjektion
Überprüfen Sie https://en.wikipedia.org/wiki/Dependency_injection
===
Dieser Code folgt bereits
Dependency Injection
und ist für die Testklasse einfacherClient
.Wir verwenden jedoch immer noch
new Service()
viel Zeit und es ist nicht gut, denService
Konstruktor zu ändern . Um dies zu verhindern, können wir DI-Injektoren wie1) Einfaches Handbuch verwenden
Injector
Verwenden von
2) Bibliothek verwenden: Für Android Dolch2
Vorteile
Service
, müssen Sie es nur in der Injector-Klasse ändernConstructor Injection
, sehen Sie beim Betrachten des Konstruktors vonClient
, wie viele Abhängigkeiten derClient
Klasse vorhanden sindNachteile
Constructor Injection
, wird dasService
Objekt beimClient
Erstellen erstellt. Manchmal verwenden wir Funktionen in derClient
Klasse, ohne dass dieService
so erstellte VerwendungService
verschwendet wirdDefinition der Abhängigkeitsinjektion
https://en.wikipedia.org/wiki/Dependency_injection
quelle
Dies bedeutet, dass Objekte nur so viele Abhängigkeiten haben sollten, wie für ihre Arbeit erforderlich sind, und dass die Abhängigkeiten gering sein sollten. Darüber hinaus sollten die Abhängigkeiten eines Objekts nach Möglichkeit von Schnittstellen und nicht von „konkreten“ Objekten abhängen. (Ein konkretes Objekt ist jedes Objekt, das mit dem Schlüsselwort new erstellt wurde.) Die lose Kopplung fördert eine bessere Wiederverwendbarkeit, eine einfachere Wartbarkeit und ermöglicht die einfache Bereitstellung von Scheinobjekten anstelle teurer Dienste.
Die "Dependency Injection" (DI) ist auch als "Inversion of Control" (IoC) bekannt und kann als Technik zur Förderung dieser losen Kopplung verwendet werden.
Es gibt zwei Hauptansätze zur Implementierung von DI:
Konstruktorinjektion
Es ist die Technik, Objektabhängigkeiten an seinen Konstruktor zu übergeben.
Beachten Sie, dass der Konstruktor eine Schnittstelle und kein konkretes Objekt akzeptiert. Beachten Sie außerdem, dass eine Ausnahme ausgelöst wird, wenn der Parameter orderDao null ist. Dies unterstreicht die Wichtigkeit, eine gültige Abhängigkeit zu erhalten. Die Konstruktorinjektion ist meiner Meinung nach der bevorzugte Mechanismus, um einem Objekt seine Abhängigkeiten zu geben. Dem Entwickler ist beim Aufrufen des Objekts klar, welche Abhängigkeiten dem Objekt "Person" für eine ordnungsgemäße Ausführung zugewiesen werden müssen.
Setter-Injektion
Betrachten Sie jedoch das folgende Beispiel… Angenommen, Sie haben eine Klasse mit zehn Methoden, die keine Abhängigkeiten aufweisen, aber Sie fügen eine neue Methode hinzu, die von IDAO abhängig ist. Sie können den Konstruktor so ändern, dass er die Konstruktorinjektion verwendet. Dies kann Sie jedoch dazu zwingen, Änderungen an allen Konstruktoraufrufen überall vorzunehmen. Alternativ können Sie einfach einen neuen Konstruktor hinzufügen, der die Abhängigkeit übernimmt. Wie kann ein Entwickler dann leicht erkennen, wann ein Konstruktor über dem anderen verwendet werden muss? Wenn die Erstellung der Abhängigkeit sehr teuer ist, warum sollte sie erstellt und an den Konstruktor übergeben werden, wenn sie möglicherweise nur selten verwendet wird? "Setter Injection" ist eine weitere DI-Technik, die in solchen Situationen eingesetzt werden kann.
Setter Injection erzwingt nicht, dass Abhängigkeiten an den Konstruktor übergeben werden. Stattdessen werden die Abhängigkeiten auf öffentliche Eigenschaften festgelegt, die vom benötigten Objekt verfügbar gemacht werden. Wie bereits angedeutet, sind die Hauptmotivatoren dafür:
Hier ist das Beispiel, wie der obige Code aussehen würde:
quelle
Ich denke, da jeder für DI geschrieben hat, möchte ich ein paar Fragen stellen.
Dies basiert auf der Antwort @Adam N geschrieben.
Warum muss sich PersonService nicht mehr um GroupMembershipService kümmern? Sie haben gerade erwähnt, dass GroupMembership mehrere Dinge (Objekte / Eigenschaften) hat, von denen es abhängt. Wenn GMService in PService erforderlich wäre, hätten Sie es als Eigenschaft. Sie können das verspotten, unabhängig davon, ob Sie es injiziert haben oder nicht. Ich möchte nur, dass es injiziert wird, wenn GMService spezifischere untergeordnete Klassen hat, die Sie erst zur Laufzeit kennen. Dann möchten Sie die Unterklasse einfügen. Oder wenn Sie das entweder als Singleton oder als Prototyp verwenden möchten. Um ehrlich zu sein, ist in der Konfigurationsdatei alles fest codiert, bis zu welcher Unterklasse für einen Typ (Schnittstelle), die während der Kompilierungszeit eingefügt werden soll.
BEARBEITEN
Ein schöner Kommentar von Jose Maria Arranz zu DI
DI erhöht die Kohäsion, indem es nicht mehr erforderlich ist, die Abhängigkeitsrichtung zu bestimmen und einen Klebercode zu schreiben.
Falsch. Die Richtung der Abhängigkeiten ist in XML-Form oder als Anmerkungen. Ihre Abhängigkeiten werden als XML-Code und Anmerkungen geschrieben. XML und Anmerkungen sind Quellcode.
DI reduziert die Kopplung, indem alle Ihre Komponenten modular (dh austauschbar) und mit genau definierten Schnittstellen zueinander ausgestattet werden.
Falsch. Sie benötigen kein DI-Framework, um einen modularen Code basierend auf Schnittstellen zu erstellen.
Informationen zum Ersetzen: Mit einem sehr einfachen .properties-Archiv und Class.forName können Sie definieren, welche Klassen geändert werden können. Wenn eine Klasse Ihres Codes geändert werden kann, ist Java nichts für Sie. Verwenden Sie eine Skriptsprache. Übrigens: Anmerkungen können nicht ohne Neukompilieren geändert werden.
Meiner Meinung nach gibt es nur einen Grund für DI-Gerüste: die Reduzierung der Kesselplatte. Mit einem gut gemachten Factory-System können Sie dasselbe tun, kontrollierter und vorhersehbarer als Ihr bevorzugtes DI-Framework. DI-Frameworks versprechen eine Reduzierung des Codes (XML und Anmerkungen sind ebenfalls Quellcode). Das Problem ist, dass diese Reduzierung der Kesselplatte nur in sehr sehr einfachen Fällen (eine Instanz pro Klasse und ähnlich) real ist. In der realen Welt ist die Auswahl des geeigneten Serviceobjekts manchmal nicht so einfach wie die Zuordnung einer Klasse zu einem Singleton-Objekt.
quelle
Die gängigen Antworten sind nicht hilfreich, da sie die Abhängigkeitsinjektion auf eine Weise definieren, die nicht nützlich ist. Lassen Sie uns zustimmen, dass wir unter "Abhängigkeit" ein bereits vorhandenes anderes Objekt verstehen, das unser Objekt X benötigt. Aber wir sagen nicht, dass wir "Abhängigkeitsinjektion" machen, wenn wir sagen
Wir nennen das nur die Übergabe von Parametern an den Konstruktor. Das machen wir regelmäßig, seit die Konstrukteure erfunden wurden.
"Abhängigkeitsinjektion" wird als eine Art "Umkehrung der Steuerung" angesehen, was bedeutet, dass dem Anrufer eine gewisse Logik entzogen wird. Dies ist nicht der Fall, wenn der Aufrufer Parameter übergibt. Wenn dies also DI wäre, würde DI keine Umkehrung der Steuerung bedeuten.
DI bedeutet, dass zwischen dem Aufrufer und dem Konstruktor eine Zwischenebene besteht, die Abhängigkeiten verwaltet. Ein Makefile ist ein einfaches Beispiel für die Abhängigkeitsinjektion. Der "Aufrufer" ist die Person, die in der Befehlszeile "make bar" eingibt, und der "Konstruktor" ist der Compiler. Das Makefile gibt an, dass der Balken von foo abhängt, und es tut a
bevor Sie a
Die Person, die "make bar" eingibt, muss nicht wissen, dass der Balken von foo abhängt. Die Abhängigkeit wurde zwischen "make bar" und gcc eingefügt.
Der Hauptzweck der Zwischenebene besteht nicht nur darin, die Abhängigkeiten an den Konstruktor zu übergeben, sondern alle Abhängigkeiten an nur einer Stelle aufzulisten und sie vor dem Codierer zu verbergen (nicht, dass der Codierer sie bereitstellt).
Normalerweise stellt die Zwischenebene Fabriken für die erstellten Objekte bereit, die eine Rolle bereitstellen müssen, die jeder angeforderte Objekttyp erfüllen muss. Das liegt daran, dass Sie durch eine Zwischenstufe, die die Details der Konstruktion verbirgt, bereits die von Fabriken verhängte Abstraktionsstrafe erhalten haben. Sie können also auch Fabriken verwenden.
quelle
Abhängigkeitsinjektion bedeutet eine Möglichkeit (eigentlich auf irgendeine Weise ) für einen Teil des Codes (z. B. eine Klasse), modular auf Abhängigkeiten (andere Teile des Codes, z. B. andere Klassen, von denen es abhängt) zuzugreifen, ohne dass diese fest codiert werden (so) Sie können sich ändern oder frei überschreiben oder bei Bedarf sogar zu einem anderen Zeitpunkt geladen werden.
(und ps, ja, es ist ein überhypter 25 $ Name für ein ziemlich einfaches Konzept geworden) , meine
.25
Centquelle
Ich weiß, dass es bereits viele Antworten gibt, aber ich fand dies sehr hilfreich: http://tutorials.jenkov.com/dependency-injection/index.html
Keine Abhängigkeit:
Abhängigkeit:
Beachten Sie, wie die
DataSourceImpl
Instanziierung in einen Konstruktor verschoben wird. Der Konstruktor verwendet vier Parameter, die die vier Werte sind, die von der benötigt werdenDataSourceImpl
. Obwohl dieMyDao
Klasse immer noch von diesen vier Werten abhängt, erfüllt sie diese Abhängigkeiten selbst nicht mehr. Sie werden von jeder Klasse bereitgestellt, die eineMyDao
Instanz erstellt.quelle
Die Abhängigkeitsinjektion ist eine mögliche Lösung für die allgemein als "Abhängigkeitsverschleierung" bezeichnete Anforderung. Die Verschleierung von Abhängigkeiten ist eine Methode, um die "offensichtliche" Natur aus dem Prozess der Bereitstellung einer Abhängigkeit für eine Klasse herauszunehmen, die dies erfordert, und daher die Bereitstellung dieser Abhängigkeit für diese Klasse in irgendeiner Weise zu verschleiern. Das ist nicht unbedingt eine schlechte Sache. In der Tat ist durch Verschleierung der Art und Weise, in der eine Abhängigkeit für eine Klasse bereitgestellt wird, etwas außerhalb der Klasse für die Erstellung der Abhängigkeit verantwortlich, was bedeutet, dass in verschiedenen Szenarien der Klasse eine unterschiedliche Implementierung der Abhängigkeit bereitgestellt werden kann, ohne dass Änderungen vorgenommen werden zur Klasse. Dies ist ideal, um zwischen Produktions- und Testmodus zu wechseln (z. B. mithilfe einer "Mock" -Dienstabhängigkeit).
Leider ist der schlechte Teil, dass einige Leute angenommen haben, dass Sie ein spezielles Framework benötigen, um Abhängigkeiten zu verschleiern, und dass Sie irgendwie ein "geringerer" Programmierer sind, wenn Sie sich dafür entscheiden, kein bestimmtes Framework dafür zu verwenden. Ein anderer, äußerst beunruhigender Mythos, an den viele glauben, ist, dass die Abhängigkeitsinjektion der einzige Weg ist, um eine Verschleierung der Abhängigkeit zu erreichen. Dies ist nachweislich und historisch und offensichtlich zu 100% falsch, aber Sie werden Schwierigkeiten haben, einige Leute davon zu überzeugen, dass es Alternativen zur Abhängigkeitsinjektion für Ihre Anforderungen zur Verschleierung von Abhängigkeiten gibt.
Programmierer haben die Anforderung der Verschleierung von Abhängigkeiten seit Jahren verstanden und viele alternative Lösungen haben sich sowohl vor als auch nach der Konzeption der Abhängigkeitsinjektion entwickelt. Es gibt Factory-Muster, aber es gibt auch viele Optionen, die ThreadLocal verwenden, bei denen keine Injektion in eine bestimmte Instanz erforderlich ist - die Abhängigkeit wird effektiv in den Thread injiziert, was den Vorteil hat, dass das Objekt verfügbar gemacht wird (über bequeme statische Getter-Methoden) alleKlasse, die dies erfordert, ohne Anmerkungen zu den Klassen hinzufügen zu müssen, die dies erfordern, und komplizierten XML-Kleber einzurichten, um dies zu ermöglichen. Wenn Ihre Abhängigkeiten für die Persistenz erforderlich sind (JPA / JDO oder was auch immer), können Sie die "tranaparente Persistenz" viel einfacher und mit Domänenmodell- und Geschäftsmodellklassen erreichen, die ausschließlich aus POJOs bestehen (dh kein Framework spezifisch / in Anmerkungen eingeschlossen).
quelle
Aus dem Buch ' Well-Grounded Java Developer: Wichtige Techniken der Java 7- und Polyglot-Programmierung
quelle
Bevor Sie zur technischen Beschreibung gehen, visualisieren Sie sie zunächst anhand eines Beispiels aus der Praxis, da Sie viele technische Informationen zum Erlernen der Abhängigkeitsinjektion finden, aber die maximale Zeit, in der Leute wie ich das Kernkonzept nicht verstehen können.
Nehmen Sie im ersten Bild an, dass Sie eine Autofabrik mit vielen Einheiten haben. Ein Auto ist tatsächlich in der Montageeinheit eingebaut , benötigt jedoch Motor , Sitze sowie Räder . Die Montageeinheit ist also von allen Einheiten abhängig und sie sind die Abhängigkeiten der Fabrik.
Sie können spüren, dass es jetzt zu kompliziert ist, alle Aufgaben in dieser Fabrik zu warten, da Sie sich neben der Hauptaufgabe (Zusammenbau des Autos in der Montageeinheit) auch auf andere Einheiten konzentrieren müssen . Die Wartung ist jetzt sehr kostspielig und das Fabrikgebäude ist riesig, sodass Sie Ihr zusätzliches Geld für die Miete benötigen.
Schauen Sie sich jetzt das zweite Bild an. Wenn Sie Anbieter finden, die Ihnen Rad , Sitz und Motor billiger als Ihre Eigenproduktionskosten anbieten, müssen Sie diese jetzt nicht mehr in Ihrer Fabrik herstellen. Sie können jetzt ein kleineres Gebäude nur für Ihre Montageeinheit mieten was Ihre Wartungsaufgabe verringert und Ihre zusätzlichen Mietkosten senkt. Jetzt können Sie sich auch nur noch auf Ihre Hauptaufgabe konzentrieren (Fahrzeugmontage).
Jetzt können wir sagen, dass alle Abhängigkeiten für die Montage eines Autos von den Anbietern im Werk eingespritzt werden . Es ist ein Beispiel für eine reale Abhängigkeitsinjektion (DI) .
Im technischen Wort ist die Abhängigkeitsinjektion eine Technik, bei der ein Objekt (oder eine statische Methode) die Abhängigkeiten eines anderen Objekts liefert. Das Übertragen der Aufgabe, das Objekt zu erstellen, an eine andere Person und die direkte Verwendung der Abhängigkeit wird als Abhängigkeitsinjektion bezeichnet.
Dies wird Ihnen jetzt helfen, DI mit einem technischen Wort zu lernen. Dies zeigt an, wann DI verwendet werden soll und wann nicht .
.
quelle
aus Book Apress.Spring.Persistence.with.Hibernate.Oct.2010
quelle
Dependency Injection (DI) ist eine von Design Patterns, die die Grundfunktion von OOP verwendet - die Beziehung in einem Objekt zu einem anderen Objekt. Während die Vererbung ein Objekt erbt, um ein anderes Objekt komplexer und spezifischer zu gestalten, erstellt eine Beziehung oder Zuordnung einfach einen Zeiger auf ein anderes Objekt von einem Objekt mithilfe eines Attributs. Die Leistung von DI wird mit anderen Funktionen von OOP kombiniert, ebenso wie Schnittstellen und versteckter Code. Angenommen, wir haben einen Kunden (Abonnenten) in der Bibliothek, der der Einfachheit halber nur ein Buch ausleihen kann.
Schnittstelle des Buches:
Als nächstes können wir viele Arten von Büchern haben; Eine der Arten ist Fiktion:
Jetzt kann der Abonnent eine Zuordnung zum Buch haben:
Alle drei Klassen können für die eigene Implementierung ausgeblendet werden. Jetzt können wir diesen Code für DI verwenden:
Es gibt viele verschiedene Möglichkeiten, die Abhängigkeitsinjektion zu verwenden. Es ist möglich, es mit Singleton usw. zu kombinieren, aber im Grunde ist es nur eine Assoziation, die durch Erstellen eines Attributs vom Objekttyp in einem anderen Objekt realisiert wird. Der Nutzen ist nur und nur in der Eigenschaft, dass der Code, den wir immer wieder schreiben sollten, immer für uns vorbereitet und erledigt wird. Aus diesem Grund ist DI so eng mit Inversion of Control (IoC) verbunden, dass unser Programm die Steuerung eines anderen laufenden Moduls übergibt, das Beans in unseren Code injiziert. (Jedes Objekt, das injiziert werden kann, kann signiert oder als Bean betrachtet werden.) Im Frühjahr wird beispielsweise ApplicationContext erstellt und initialisiertContainer, der diese Arbeit für uns erledigt. Wir erstellen einfach in unserem Code den Kontext und rufen die Initialisierung der Beans auf. In diesem Moment wurde die Injektion automatisch durchgeführt.
quelle
Abhängigkeitsinjektion für 5-Jährige.
Wenn Sie Dinge selbst aus dem Kühlschrank holen, können Sie Probleme verursachen. Sie könnten die Tür offen lassen, Sie könnten etwas bekommen, das Mama oder Papa nicht wollen, dass Sie haben. Möglicherweise suchen Sie sogar nach etwas, das wir nicht einmal haben oder das abgelaufen ist.
Was Sie tun sollten, ist ein Bedürfnis zu äußern: "Ich brauche etwas zum Mittagessen zu trinken", und dann werden wir sicherstellen, dass Sie etwas haben, wenn Sie sich zum Essen hinsetzen.
quelle
Aus Christoffer Noring, Pablo Deelemans Buch „Learning Angular - Second Edition“:
„Da unsere Anwendungen wachsen und sich entwickelt, jeder unserer Code Einheiten werden intern benötigen Instanzen anderer Objekte , die besser als bekannt sind , sind Abhängigkeiten in der Welt der Software - Engineering. Die Aktion der Weitergabe solcher Abhängigkeiten zu den abhängigen Client ist bekannt als Injektion , und es beinhaltet auch die Teilnahme einer anderen Code-Entität, die als Injektor bezeichnet wird . Der Injektor übernimmt die Verantwortung für das Instanziieren und Bootstrapping des erforderlichen AbhängigkeitenSie sind also ab dem Moment einsatzbereit, in dem sie erfolgreich in den Client injiziert wurden. Dies ist sehr wichtig, da der Client nichts darüber weiß, wie er seine eigenen Abhängigkeiten instanziieren kann, und nur die Schnittstelle kennt, die er implementiert, um sie zu verwenden. "
Von: Anton Moiseev. Buch „Angular Development with Typescript, Second Edition.“:
„Kurz gesagt, DI hilft Ihnen , Code in einem schreiben lose gekoppelter Weise und macht Ihren Code mehr prüfbar und wiederverwendbar .“
quelle
Mit einfachen Worten: Abhängigkeitsinjektion (DI) ist der Weg, um Abhängigkeiten oder enge Kopplungen zwischen verschiedenen Objekten zu entfernen. Die Abhängigkeitsinjektion verleiht jedem Objekt ein zusammenhängendes Verhalten.
DI ist die Implementierung des IOC-Principals von Spring, das besagt: "Rufen Sie uns nicht an, wir rufen Sie an". Bei Verwendung des Abhängigkeitsinjektionsprogrammierers muss kein Objekt mit dem neuen Schlüsselwort erstellt werden.
Objekte werden einmal in den Spring-Container geladen und dann bei Bedarf wiederverwendet, indem wir diese Objekte mit der Methode getBean (String beanName) aus dem Spring-Container abrufen.
quelle
Die Abhängigkeitsinjektion ist das Herzstück des Konzepts im Zusammenhang mit Spring Framework. Während die Erstellung des Frameworks für jedes Projekt eine wichtige Rolle spielt, spielt die Abhängigkeitsinjektion hier eine wichtige Rolle.
Angenommen, Sie haben in Java zwei verschiedene Klassen als Klasse A und Klasse B erstellt und unabhängig davon, welche Funktionen in Klasse B verfügbar sind, die Sie in Klasse A verwenden möchten. Zu diesem Zeitpunkt kann also die Abhängigkeitsinjektion verwendet werden. Wenn Sie Objekte einer Klasse in einer anderen Klasse erstellen können, können Sie auf die gleiche Weise eine ganze Klasse in eine andere Klasse einfügen, um sie zugänglich zu machen. Auf diese Weise kann die Abhängigkeit überwunden werden.
ABHÄNGIGE INJEKTION VERKLEIDET EINFACH ZWEI KLASSEN UND HÄLT SIE GLEICHZEITIG.
quelle