Hi,
eigentlich ist die Idee hinter DI sehr einfach. Dieses Muster ähnelt (stark) dem Fabrikmuster.
In der OOP erzeugst du ja Klassen. Ziel ist es auch, dass diese nicht unnötig aufgebläht werden sondern möglichst einfach sind und genau für die Lösung eines Problems. Das führt zu modularem, leicht wartbaren Code, der aber in sehr vielen Klassen abgelegt wird.
Wenn du jetzt mit einer Klasse arbeitest, so hat sie häufig ein paar Abhängigkeiten. Sagen wir mal du schreibst deinen eigenen Compiler, dann muss ein File eingelesen werden, in Token zerlegt und diese dann geparst werden...
Schon diese paar Schritte gehören in eigene Klassen. Schließlich kann sich etwas am Parser ändern, ohne dass du dazu wissen muss wie eine Datei in Token zerlegt wird.
Dennoch hast du eine Menge Abhängigkeiten. Damit dein Compiler funktionieren kann, muss er geparste Token bekommen. Sauber OOP ist es hier schonmal, wenn er diese Abhängigkeit als Interface regelt (er möchte eine Instanz die ein bestimmtes Interface implementiert). Dummerweise muss er jetzt zum Erzeugen einer solchen Instanz aber auch eine konkrete Implementierung dieses Interfaces kennen. Das heißt, hier ist eine Abhängigkeit vorhanden.
Bei DI wird diese Abhängigkeit aufgelöst. Wo die Instanz herkommt und welcher Konkreten Implementierung sie angehört ist oft nicht nötig zu wissen. Hier wird eine äussere Klasse aufgerufen, die die konkreten Instanzen erzeugt und deiner Klasse zuweist.
Um beim Beispiel zu bleiben, ITokenizer ist ein Interface, dass ein Funktion getToken() bietet. Dein Parser braucht nur diese Methode, interessiert sich aber nicht wie die Token erzeugt werden. Da du aber ein ITokenizer brauchst, der dir die Token liefert, erzeugt sich dein Parser eben eine Instanz (und muss dazu die entsprechende Klasse kennen).
Mit DI geht das dann anders, hier hast du etwas aussen rum, der erzeugt eine Instanz TokenizerA oder TokenizerB oder was auch immer, die ITokenizer implentiert und übergibt die per setter an die ebenfalls hier erzeugte Instanz von Parser. Die einzelnen Klassen müssen sich also nicht mehr kennen. Nur eine hat "den Überblick" und erzeugt alle Instanzen und weißt diese zu.
Bei DI werden aber eben nur solche Abhängigkeiten aufgelöst, also Instanzen erzeugt und zugewiesen. Imho wird (anders als bei einer Fabrik) dabei keine Initialisierung vorgenommen.
Gruß Der Anmeldboykottierer