Dependency Injection in ASP.NET Core verständlich erklärt
Warum ein Controller seine Abhängigkeiten nicht selbst erzeugen sollte und wie der eingebaute DI-Container den Code testbar macht.

In vielen Einsteigerprojekten erzeugt ein Controller seine Abhängigkeiten selbst: new BlogManager(new EfBlogRepository()). Das funktioniert, koppelt aber alles fest aneinander. Dependency Injection löst dieses Problem elegant.
Das Prinzip
Eine Klasse beschreibt im Konstruktor, was sie braucht – zum Beispiel ein IBlogService. Wer das konkrete Objekt erzeugt, entscheidet nicht die Klasse selbst, sondern der DI-Container. Die Klasse kennt nur die Schnittstelle.
Registrierung in Program.cs
In ASP.NET Core werden Dienste beim Start registriert: services.AddScoped<IBlogService, BlogManager>(). „Scoped“ bedeutet: Pro HTTP-Anfrage gibt es genau eine Instanz. Das ist ideal für den Datenbankkontext, denn alle Repositories einer Anfrage teilen sich dieselbe Verbindung.
Die drei Lebensdauern
Singleton lebt so lange wie die Anwendung, Scoped so lange wie eine Anfrage und Transient wird bei jeder Verwendung neu erzeugt. Als Faustregel gilt: Alles, was den Datenbankkontext verwendet, ist Scoped.
Warum sich das lohnt
Im Test können Sie statt der echten Datenbank ein Fake-Repository übergeben. Und wenn Sie später von SQL Server auf SQLite wechseln, ändern Sie eine Zeile in der Registrierung – nicht hunderte Stellen im Code.
Dependency Injection wirkt anfangs wie zusätzlicher Aufwand. Spätestens beim ersten Test oder Datenbankwechsel zeigt sich, wie viel Zeit es spart.



2 Kommentare
Frage zu Singleton
Kann man den DbContext auch als Singleton registrieren? Oder führt das zu Problemen?
Endlich verstanden
Ich habe DI dreimal in Tutorials gesehen, aber erst hier wirklich verstanden, warum Scoped wichtig ist.