Funktion, Eigenschaften und Besonderheiten sowie Anwendungen von Dependency Injection
Dependency Injection, kurz DI, nimmt aufgrund der Auswirkungen auf die Code-Vereinfachung immer mehr zu. Wenn du noch keine Gelegenheit hattest, DI zu erlernen und anzuwenden, wird dich dieser Artikel mit den Konzepten vertraut machen und veranschaulichen, wie die Dependency Injection funktioniert.
Was ist Dependency Injection?
Beim Software-Engineering ist Dependency Injection eine Technik, bei der ein Objekt (oder eine statische Methode) die Abhängigkeiten eines anderen Objekts liefert. Eine Abhängigkeit wiederum ist ein Objekt, das verwendet werden kann (ein Dienst). Eine Injektion ist die Weitergabe einer Abhängigkeit an ein abhängiges Objekt (einen Client), das diese verwenden würde. Die Weitergabe des Dienstes an den Client, anstatt einem Client das Erstellen oder Finden des Dienstes zu ermöglichen, ist die grundlegende Anforderung des Musters bei der Dependency Injection.
Hinter der Dependency Injection steht die Absicht, Objekte so weit zu entkoppeln, dass kein Client-Code geändert werden muss, nur weil ein Objekt, von dem es abhängig ist, in einen anderen geändert werden muss. Die Dependency Injection ist eine Form der umfassenderen Technik der Inversion der Kontrolle. Wie bei anderen Formen der Inversion der Kontrolle unterstützt die Dependency Injection das Prinzip der Abhängigkeitsinversion. Der Client überträgt die Verantwortung für die Bereitstellung seiner Abhängigkeiten an externen Code (den Injektor). Der Client darf den Injector-Code nicht aufrufen. Dies ist der Injection-Code, der die Dienste erstellt und den Client auffordert, sie einzuspeisen. Dies bedeutet, dass der Clientcode nicht über den einzuführenden Code Bescheid wissen muss, wie die Services erstellt werden sollen oder welche Services tatsächlich verwendet werden. Der Client muss nur die intrinsischen Schnittstellen der Services kennen, da diese festlegen, wie der Client die Services verwenden darf. Dies trennt die Verantwortlichkeiten für Nutzung und Konstruktion.
Es gibt drei gängige Mittel, mit denen ein Client eine Dependency Injection akzeptieren kann: Setter-, Schnittstellen- und Konstruktorbasierte Injektion. Setter und Konstruktorinjektion unterscheiden sich hauptsächlich darin, wann sie verwendet werden können. Die Schnittstelleninjektion unterscheidet sich dadurch, dass der Abhängigkeit die Möglichkeit gegeben wird, die eigene Injektion zu steuern. Für jedes muss ein separater Konstruktionscode (der Injektor) die Verantwortung dafür übernehmen, dass ein Client und seine Abhängigkeiten zueinander eingeführt werden.
Wie funktioniert Dependency Injection?
Dependency Injection löst Probleme wie:
- Wie kann eine Anwendung oder Klasse unabhängig von der Erstellung ihrer Objekte sein?
- Wie kann festgelegt werden, wie Objekte in separaten Konfigurationsdateien erstellt werden?
- Wie kann festgelegt werden, wie Objekte in separaten Konfigurationsdateien erstellt werden?
Das Erstellen von Objekten direkt innerhalb der Klasse, für die die Objekte erforderlich sind, ist unflexibel, da die Klasse für bestimmte Objekte festgelegt wird und die spätere Änderung der Instantiierung nicht unabhängig von der Klasse (ohne Änderung dieser) möglich ist. Dadurch wird verhindert, dass sie wieder verwendet werden kann, wenn andere Objekte erforderlich sind. Außerdem ist die Klasse schwer zu testen, da echte Objekte nicht durch Scheinobjekte ersetzt werden können.
Eigenschaften und Besonderheiten von Dependency Injection. In welchen Frameworks und Programmiersprachen kann ich Depedendency Injection nutzen?
Die Dependency Injection ist eine beliebte Alternative zum Service Locator-Muster. Viele moderne Anwendungsframeworks implementieren diese Technik und diese Frameworks stellen die technischen Teile der Technik bereit, sodass du dich auf die Implementierung deiner Geschäftslogik konzentrieren kannst. Beliebte Beispiele sind:
- Spring (Java)
- Google Guice (Java)
- Dagger (Java and Android)
- Castle Windsor (.NET)
- Unity(.NET)
- Wallaroo (C++)
- Hypodermic (C++)
- Robotlegs (Actionscript)
- LightWire (ColdFusion)
- Orochi (Perl]
- Phemto (PHP 5)
- Laravel (PHP 5)
- SpringPython (Python)
- Zenject (Unity 3D)
Abhängigkeitsinjektion kann als eine Disziplin angewendet werden, die dazu auffordert, dass alle Objekte Konstruktion und Verhalten voneinander trennen. Die Verwendung eines DI-Frameworks für die Ausführung von Konstruktionen kann dazu führen, dass die Verwendung des neuen Schlüsselworts oder die direkte Erstellung von Wertobjekten verboten wird.
Warum sollte ich Dependency Injection nutzen?
Dependency Injection Abhängigkeitsinjektion wird in der Entwicklergemeinde immer beliebter. Inversion of Control spricht darüber, wer den Anruf einleiten soll, während die Dependency Injection davon spricht, wie ein Objekt durch Abstraktion eine Abhängigkeit von einem anderen Objekt erlangt. Wenn du Dependency Injection verwendest, kannst du zwischen verschiedenen Stilen wählen. Dieses Entwurfmuster hilft auch bei der Klassenentkopplung und macht es einem Entwickler leicht, Abhängigkeiten zwischen Objekten zu verwalten. Dadurch wird es dir einfacher fallen, zusammenhängende Funktionen in deinen eigenen Vertrag zu integrieren. Infolgedessen wird der Code stärker modularisiert. Dependency Injection erhöht auch die Wiederverwendbarkeit des Codes und verbessert die Wartbarkeit und das Testen von Codes.