Kurz erklärt
Bei Dependency Injection (Abhängigkeitsinjektion) bekommt ein Objekt die Dinge, die es braucht, von außen übergeben, statt sie selbst zu erzeugen – meist über den Konstruktor.
Genauer
Dadurch hängt eine Klasse nur von einer Schnittstelle ab, nicht von einer konkreten Umsetzung. Die konkrete Variante wird an einer zentralen Stelle gewählt. Das senkt die Kopplung, macht Code austauschbar und erst richtig testbar (Unit-Tests bekommen Attrappen statt echter Datenbanken).