Einführung

Mit Dependency Injection wird bewirkt, dass eine Klasse selber keine Abhängigkeiten mehr verwalten muss, da diese von aussen zur Verfügung gestellt werden. Dadurch soll es möglich werden, die Module, von welchen eine Klasse abhängig ist, frei zu wechseln, ohne die Klasse selber zu verändern.

Eine Abhängigkeit kann mittels Dependency Injection an drei verschiedenen Stellen eingeführt werden. Es ist möglich, die Abhängigkeit bei der Konstruktion des Clients zu erstellen, hierbei wird die Abhängigkeit in den Konstruktor eingeführt, eine zweite Möglichkeit ist es, die Abhängigkeit mit einer Methode zu setzen, welche nach dem Konstruktor aufgerufen wird. Die letzte Möglichkeit ist es, die Abhängigkeit direkt im Feld einzuführen, sodass weder ein Konstruktor noch eine spezifische Methode benötigt wird.

Die Dependency Injection ist eine Erweiterung der Dependency Inversion unter dem SOLID Prinzip, welche die Abhängigkeit von unten nach oben bringt.

Rollen

Für die Umsetzung der Dependency Injection werden vier Rollen benötigt. Diese werden folgend kurz erläutert.

Service

Der Service ist der Teil der Applikation, welcher an einer anderen Stelle genutzt werden soll, da dieser einen Teil der benötigten Geschäftslogik implementiert. Damit die Applikation möglichst modular bleibt und mit dem Dependency Inversion Principle übereinstimmt, wird ein Service nie direkt in einem Client genutzt. Anstelle dessen implementiert ein Service ein Interface, welches wiederum von Clients verwendet werden kann.

Client

Der Client bezeichnet den Teil der Applikation, welcher einen Service konsumieren und benutzen soll. Die Abhängigkeit soll hier “eingespritzt” werden. Dadurch kann der Client die Funktionalitäten des Interface, welche vom Service implementiert werden, einfach nutzen ohne sich darum kümmern zu müssen, welche Implementation er jetzt benutzt.

Interface

Das Interface ist die Abstraktion zwischen Client und Service. Es definiert eine Schnittstelle, wodurch ein Client weiss, welche Methoden ihm auf einem Service zur Verfügung stehen und macht es für einen Service klar, welche Methoden implementiert werden müssen.

Injector

Die Aufgabe des Injektors ist es, die jeweiligen Services mittels der Interfaces in die Clients “einzuspritzen”, damit diese sie benutzen können. Der Injector ist im Vergleich zur Dependency Inversion die einzig neue Rolle, welche zu vor noch nicht benötigt wurde.

CDI

Contexts and Dependency Injection (CDI) ist ein Java-Standard, welcher das Prinzip der Dependency Injection erweitert. CDI ermöglicht es, die Abhängigkeiten der verschiedenen Module automatisiert zu injizieren, wodurch es nicht mehr nötig ist, die benötigten Abhängigkeiten manuell mitzugeben. CDI entscheidet anhand des Programmcodes und einer Konfiguration, welche Abhängigkeit wo benötigt wird.

Ressourcen

Wikipedia - Prinzipien objektorientierten Designs
Wikipedia - Contexts and Dependency Injection
Stackify - Dependency Injection
Stackify - Dependency Inversion Principle

Beispiel

Um dieses Prinzip zu verdeutlichen, gibt es hier ein kleines Beispiel in Java. Dabei soll eine Applikation erstellt werden, welche genutzt werden kann, um mit unterschiedlichen Kaffeemaschinen Kaffee zu brühen.

Ausgangslage

Für die Ausgangslage gibt es zwei Kaffeemaschine, die BasicCoffeeMachine und die PremiumCoffeeMachine. Beide Maschinen haben eine Method, um Kaffee zu brühen, jedoch kann die PremiumCoffeeMachine neben dem Filterkaffee auch noch Espresso brühen.

Abstraktion

Der erste Schritt zur Dependency Injection ist die Abstraktion der öffentlichen Methoden. Dazu muss ein Interface für die Kaffeemaschine erstellt werden. Da nicht jede Kaffeemaschine Espresso brühen kann, gibt es hier zwei Interfaces, ein Grundlegendes für alle Kaffeemaschine, welches Filterkaffee brühen kann und ein zweites für die Premium Kaffeemaschine, welche auch Espresso brühen kann. Die BasicCoffeeMachine kann dann das einfachere Interface implementieren und die PremiumCoffeeMachine implementiert einfach beide.

Refactoring

Applikation

Da nun beide Klassen ihre Interfaces implementieren, kann die Kaffeeapplikation nach dem Dependency Injection Prinzip erstellt werden. Die Applikation muss jetzt nicht mehr selber verwalten, welche Kaffeemaschine sie benötigt, sondern kann einfach die Interfaces, welche sie benötigt über ihren Konstruktor anfordern. Wodurch die richtige Kaffeemaschine bei der Erstellung der Kaffeeapplikation injiziert werden kann.

Last updated 18 Okt. 2024, 10:59 +0200 . history