Dependency Injection ist ein Entwurfsmuster, bei dem ein Objekt die Dinge, die es zum Arbeiten braucht, von außen gereicht bekommt, statt sie selbst zu erzeugen. Den Namen hat Martin Fowler 2004 in einem Aufsatz geprägt.
- Dependency Injection
Ein Entwurfsmuster, bei dem die Abhängigkeiten eines Objekts von außen übergeben werden, meist über den Konstruktor.
Beispiel: „Dank Dependency Injection bekommt der Mailversand im Test einen Ersatz, der nur protokolliert und nichts verschickt.“Auch: Abhängigkeitsinjektion, abgekürzt DI.
Verwandt: Inversion of Control, das allgemeinere Prinzip, nach dem ein Framework den Ablauf steuert und den eigenen Code aufruft.
Wie Dependency Injection funktioniert
Eine Klasse, die Bestellungen verarbeitet, braucht einen Zugang zur Datenbank und einen Mailversand. Ohne das Muster erzeugt sie beides selbst. Mit Dependency Injection nennt sie beides im Konstruktor, und wer die Klasse erzeugt, reicht die passenden Objekte hinein.
class Bestellabschluss
{
public function __construct(
private Bestellungen $bestellungen,
private Mailer $mailer,
) {}
}Die Klasse weiß dann nur noch, was sie braucht, und nicht mehr, woher es kommt.
Der Container bei Dependency Injection
In Frameworks wie Laravel, Symfony und Spring übernimmt ein Container das Hineinreichen. Er liest, was eine Klasse im Konstruktor verlangt, erzeugt die passenden Objekte und gibt sie weiter, auch über mehrere Ebenen hinweg.
Warum sich Dependency Injection lohnt
Vor allem wegen der Tests. Eine Klasse, die ihre Abhängigkeiten von außen bekommt, lässt sich im Test mit Ersatzobjekten füttern, die keine echte Datenbank und keinen echten Mailserver brauchen.
Dazu kommt Austauschbarkeit: Wechselt der Mailanbieter, wird an einer Stelle festgelegt, welche Umsetzung der Container liefert, und alle Klassen nutzen sie.