Dependency Injection mit .NET Core

Dependency Injection mit .NET Core


Bei der Dependency Injection (Abhängigkeitsinjektion) handelt es sich um ein Entwurfsmuster, mit dem Abhhängigkeiten von Objekten einfacher verwaltet werden können. Wird ein Objekt neu erstellt, werden die Abhängigkeiten zum Beispiel im Konstruktor übergeben.
Das hat den Vorteil, dass das erstellte Objekt nicht verantwortlich für seine Abhängigkeiten ist und die Kopplung (coupling) zwischen den Objekten verringert wird. Die Verknüpfungen können damit z.B. in Factories zentral gesteuert werden.

Authentifizierung

Beispiel einer einfachen Dependency Injection in C#

Bei dem nachfolgenden Beispiel könnte es sich um eine Anwendung handeln, die Rechnungsdaten aus einer Datenbank bezieht. Sie verfügt über eine Klasse (DatenbankService), die ausschließlich Daten aus einer Datenbank liest und schreibt. Über eine weitere Klasse (DatenArchiv) sollen Daten ausgewertet und verarbeitet werden. Diese Klasse erhält die Daten aus dem Datenbank-Service. Der Service soll mittels Dependency-Injection übergeben werden.


Abhängigkeit Datenbank-Service

Mit der DatenbankService-Klasse soll auf eine Datenbank direkt zugegriffen werden.

public class DatenbankService
{
     public void SchreibeDaten()
     {
          Console.WriteLine("Schreibe Daten in Datenbank....");
     }
}

Constructor Injection

Mit der DatenArchiv-Klasse sollen Daten verarbeitet (gelesen, gespeichert, ausgewertet,...) werden. Der Konstruktor der Klasse erwartet ein Objekt vom Typ DatenbankService. Die Referenz wird privat in der Klasse festgehalten. Somit kann in den Methoden auf den Datenbankservice zugegriffen werden, ohne dass die DatenArchiv-Klasse an der Initialisierung des Services beteiligt ist.

public class DatenArchiv
{
     private readonly DatenbankService _datenbankService;

     public DatenArchiv(DatenbankService datenbankService)
     {
          _datenbankService = datenbankService;
     }

     public void AktualisiereDaten()
     {
          _datenbankService.SchreibeDaten();
          // ...
     }
}

Aufruf im Client

Der Client kann nun den Service erstellen und die Referenz dem DatenArchiv-Objekt übergeben.

DatenbankService dbService = new DatenbankService();
DatenArchiv datenArchiv = new DatenArchiv(dbService);
datenArchiv.AktualisiereDaten();
// ...

Ergänzungen

Weiter bietet es sich an, ein Interface zu erstellen und den DatenbankService in einer Factory zu erstellen. Dadurch könnten z.B. Services für verschiedene Datenbank-Systeme (SQLite, MySQL, MongoDB,...) zur Laufzeit ausgetauscht werden, ohne die DatenArchiv-Klasse anpassen zu müssen. Mittels Dependency Injection kann dem Datenbank-Service zustzälich die Konfiguration (Datenbank Connectionstring,...) übergeben werden. Siehe dazu: Konfiguration von .NET Core-Anwendungen.