Eine kurze Einführung in Dependency Injection: Was es ist und wann es verwendet werden soll

Einführung

In der Softwareentwicklung ist die Abhängigkeitsinjektion eine Technik, bei der ein Objekt (oder eine statische Methode) die Abhängigkeiten eines anderen Objekts liefert. Eine Abhängigkeit ist ein Objekt, das verwendet werden kann (ein Dienst).

Das ist zwar die Wikipedia-Definition, aber nicht besonders leicht zu verstehen. Also lasst es uns besser verstehen.

Bevor wir verstehen, was es in der Programmierung bedeutet, wollen wir zunächst sehen, was es im Allgemeinen bedeutet, da es uns hilft, das Konzept besser zu verstehen.

Abhängigkeit oder Abhängigkeit bedeutet, sich auf etwas zu verlassen, um Unterstützung zu erhalten. Wenn ich sage, wir verlassen uns zu sehr auf Mobiltelefone, bedeutet dies, dass wir von ihnen abhängig sind.

Bevor wir also zu Abhängigkeitsinjektionen kommen , wollen wir zunächst verstehen, was eine Abhängigkeit in der Programmierung bedeutet.

Wenn Klasse A einige Funktionen der Klasse B verwendet, heißt es, dass Klasse A eine Abhängigkeit von Klasse B hat.

Bevor wir in Java Methoden anderer Klassen verwenden können, müssen wir zuerst das Objekt dieser Klasse erstellen (dh Klasse A muss eine Instanz der Klasse B erstellen).

Das Übertragen der Aufgabe, das Objekt zu erstellen, an eine andere Person und die direkte Verwendung der Abhängigkeit wird als Abhängigkeitsinjektion bezeichnet.

Warum sollte ich die Abhängigkeitsinjektion verwenden?

Angenommen, wir haben eine Fahrzeugklasse, die verschiedene Objekte wie Räder, Motor usw. enthält.

Hier ist die Fahrzeugklasse für die Erstellung aller Abhängigkeitsobjekte verantwortlich. Was ist nun, wenn wir uns entscheiden, MRFWheels in Zukunft wegzulassen und Yokohama Wheels verwenden möchten ?

Wir müssen das Autoobjekt mit einer neuen Yokohama-Abhängigkeit neu erstellen. Bei Verwendung der Abhängigkeitsinjektion (DI) können wir die Räder jedoch zur Laufzeit ändern (da Abhängigkeiten zur Laufzeit und nicht zur Kompilierungszeit injiziert werden können).

Sie können sich DI als den Mittelsmann in unserem Code vorstellen, der die ganze Arbeit erledigt, um das bevorzugte Radobjekt zu erstellen und es der Fahrzeugklasse zur Verfügung zu stellen.

Dies macht unsere Fahrzeugklasse unabhängig von der Erstellung von Objekten aus Rädern, Batterien usw.

Grundsätzlich gibt es drei Arten der Abhängigkeitsinjektion:

  1. Konstruktorinjektion: Die Abhängigkeiten werden über einen Klassenkonstruktor bereitgestellt.
  2. Setter-Injection: Der Client stellt eine Setter-Methode zur Verfügung, mit der der Injektor die Abhängigkeit injiziert.
  3. Schnittstelleninjektion: Die Abhängigkeit bietet eine Injektormethode, mit der die Abhängigkeit in jeden an sie übergebenen Client injiziert wird. Clients müssen eine Schnittstelle implementieren, die eine Setter-Methode verfügbar macht, die die Abhängigkeit akzeptiert.

Jetzt liegt es in der Verantwortung der Abhängigkeitsinjektion:

  1. Erstellen Sie die Objekte
  2. Wissen, welche Klassen diese Objekte benötigen
  3. Und stellen Sie ihnen all diese Objekte zur Verfügung

Wenn sich Objekte ändern, prüft DI dies und sollte die Klasse, die diese Objekte verwendet, nicht betreffen. Auf diese Weise ist der DI dafür verantwortlich, der Klasse die entsprechenden Objekte zur Verfügung zu stellen, wenn sich die Objekte in Zukunft ändern.

Umkehrung der Kontrolle - das Konzept hinter DI

Dies besagt, dass eine Klasse ihre Abhängigkeiten nicht statisch konfigurieren sollte, sondern von einer anderen Klasse von außerhalb konfiguriert werden sollte.

Es ist das fünfte Prinzip von SOLID - dasFünf Grundprinzipien der objektorientierten Programmierung und Gestaltung von Onkel Bob - die besagen, dass eine Klasse von der Abstraktion und nicht von Konkretionen abhängen sollte (in einfachen Worten, fest codiert).

Gemäß den Grundsätzen sollte sich eine Klasse darauf konzentrieren, ihre Verantwortlichkeiten zu erfüllen und nicht Objekte zu erstellen, die sie zur Erfüllung dieser Verantwortlichkeiten benötigt. Und hier kommt die Abhängigkeitsinjektion ins Spiel: Sie liefert der Klasse die erforderlichen Objekte.

Hinweis: Wenn Sie mehr über die SOLID- Prinzipien von Onkel Bob erfahren möchten, können Sie diesen Link aufrufen .

Vorteile der Verwendung von DI

  1. Hilft beim Unit-Test.
  2. Der Kesselplattencode wird reduziert, da die Initialisierung der Abhängigkeiten durch die Injektorkomponente erfolgt.
  3. Das Erweitern der Anwendung wird einfacher.
  4. Hilft bei der Aktivierung der losen Kopplung, was bei der Anwendungsprogrammierung wichtig ist.

Nachteile von DI

  1. Das Lernen ist etwas komplex und kann bei Überbeanspruchung zu Managementproblemen und anderen Problemen führen.
  2. Viele Kompilierungsfehler werden zur Laufzeit verschoben.
  3. Abhängigkeitsinjektions-Frameworks werden mit Reflexion oder dynamischer Programmierung implementiert. Dies kann die Verwendung der IDE-Automatisierung behindern, z. B. "Referenzen finden", "Anrufhierarchie anzeigen" und sicheres Refactoring.

Sie können die Abhängigkeitsinjektion selbst implementieren (Pure Vanilla) oder Bibliotheken oder Frameworks von Drittanbietern verwenden.

Bibliotheken und Frameworks, die DI implementieren

  • Frühling (Java)
  • Google Guice (Java)
  • Dolch (Java und Android)
  • Schloss Windsor (.NET)
  • Einheit (.NET)

Weitere Informationen zur Abhängigkeitsinjektion finden Sie in den folgenden Ressourcen:

Java Dependency Injection - Beispiel-Tutorial für DI-Entwurfsmuster - JournalDev

Verwenden der Abhängigkeitsinjektion in Java - Einführung - Tutorial - Vogella

Inversion von Kontrollcontainern und das Abhängigkeitsinjektionsmuster - Martin Fowler

Ich hoffe es hilft!

Wenn Ihnen der Artikel gefallen hat und Sie weitere erstaunliche Artikel lesen möchten, folgen Sie mir hier (Bhavya Karia) und zeigen Sie Ihre Unterstützung, da dies mich motiviert, mehr zu schreiben.

Wenn Sie Fragen oder Feedback für mich haben, können Sie sich auf LinkedIn, Twitter, Facebook verbinden.

Bearbeiten 1:

Dank Sergey Ufocoder wurde dieser Artikel jetzt in die russische Sprache konvertiert. Meine russischen Freunde und alle, die die russische Sprache lesen können, lesen sie.

Link zum Artikel

Wenn Sie DI in JavaScript anwenden möchten und nach einer Bibliothek suchen, empfiehlt Jo Surikat, dass Sie seine Bibliothek ausprobieren.

Di-Ninja

Eine weitere großartige DI-Bibliothek in JavaScript wurde von Nicolas Froidure vorgeschlagen.

Messerzyklus

Bearbeiten 2:

Wenn Sie ein PHP-Entwickler sind, machen Sie sich keine Sorgen, Sie haben auch alles abgedeckt. Gordon Forsythe hat diese erstaunliche Bibliothek empfohlen, die Sie alle ausprobieren möchten.

Auryn

Vielen Dank für all die freundlichen Worte, die ich erhalten habe. Teilen Sie den Artikel, damit immer mehr Menschen davon profitieren können.

Wenn Sie auch nur ein oder zwei Dinge gelernt haben, teilen Sie diese Geschichte bitte mit!