Dependency Injection-Container für C# (.NET): Vollständige Anleitung

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Dependency Injection-Container für C# (.NET): Vollständige Anleitung

\n\n

Dependency Injection (DI) ist eines der wichtigsten Entwurfsmuster in der modernen Entwicklung mit C# und .NET. Es ermöglicht die Erstellung von lose gekoppelten, testbaren und leicht wartbaren Anwendungen. In diesem Artikel betrachten wir im Detail, was ein Dependency Injection-Container ist, wie man ihn in .NET verwendet, und geben praktische Codebeispiele.

\n\n

Was ist Dependency Injection?

\n\n

Dependency Injection (Abhängigkeitsinjektion) ist ein Muster, bei dem ein Objekt seine Abhängigkeiten von außen erhält, anstatt sie selbst zu erstellen. Dies ermöglicht:

\n
    \n
  • Geringere Kopplung zwischen Komponenten
  • \n
  • Vereinfachtes Testen (Möglichkeit, Abhängigkeiten durch Mocks zu ersetzen)
  • \n
  • Erhöhte Flexibilität und Wiederverwendbarkeit von Code
  • \n
  • Zentrale Verwaltung des Lebenszyklus von Objekten
  • \n
\n\n

Was ist ein DI-Container?

\n\n

Ein DI-Container (oder IoC-Container) ist eine Bibliothek, die den Prozess der Abhängigkeitsinjektion automatisiert. Er übernimmt die Verantwortung für die Erstellung von Objekten und die Verwaltung ihrer Lebensdauer. In .NET ist der wichtigste DI-Container Microsoft.Extensions.DependencyInjection, der in ASP.NET Core integriert ist und in jeder .NET-Anwendung verwendet werden kann.

\n\n

Grundlegende Konzepte des DI-Containers

\n\n

Der DI-Container arbeitet mit den folgenden Konzepten:

\n
    \n
  • Dienstregistrierung – der Prozess des Hinzufügens von Typen und deren Implementierungen zum Container
  • \n
  • Auflösung von Abhängigkeiten – automatische Erstellung von Objekten mit ihren Abhängigkeiten
  • \n
  • Lebensdauer von Diensten – legt fest, wie lange ein Objekt existiert (Transient, Scoped, Singleton)
  • \n
\n\n

Einrichtung des DI-Containers in .NET

\n\n

Um mit dem DI-Container zu arbeiten, muss das Paket Microsoft.Extensions.DependencyInjection installiert werden. Dies kann über NuGet erfolgen:

\n\n
dotnet add package Microsoft.Extensions.DependencyInjection
\n\n

Nach der Installation wird eine Instanz von ServiceCollection erstellt, in der alle Abhängigkeiten registriert werden:

\n\n
using Microsoft.Extensions.DependencyInjection;\n\n// Erstellen einer Dienstsammlung\nvar services = new ServiceCollection();\n\n// Registrieren der Dienste\nservices.AddTransient<ILogger, ConsoleLogger>();\nservices.AddScoped<IUserRepository, UserRepository>();\nservices.AddSingleton<IConfiguration, AppConfiguration>();\n\n// Erstellen des Dienstanbieters\nvar serviceProvider = services.BuildServiceProvider();
\n\n

Beispiel für die Verwendung des DI-Containers

\n\n

Betrachten wir ein reales Beispiel: eine Anwendung zur Benutzerverwaltung. Erstellen wir Schnittstellen und deren Implementierungen:

\n\n
public interface IUserRepository\n{\n    User GetUser(int id);\n}\n\npublic interface IEmailService\n{\n    void SendEmail(string to, string subject);\n}\n\npublic class UserRepository : IUserRepository\n{\n    public User GetUser(int id)\n    {\n        // Logik zum Abrufen des Benutzers aus der Datenbank\n        return new User { Id = id, Name = "John Doe" };\n    }\n}\n\npublic class EmailService : IEmailService\n{\n    public void SendEmail(string to, string subject)\n    {\n        Console.WriteLine($"E-Mail gesendet an {to}: {subject}");\n    }\n}
\n\n

Jetzt erstellen wir die Klasse UserService, die diese Abhängigkeiten verwendet:

\n\n
public class UserService\n{\n    private readonly IUserRepository _userRepository;\n    private readonly IEmailService _emailService;\n\n    public UserService(IUserRepository userRepository, IEmailService emailService)\n    {\n        _userRepository = userRepository;\n        _emailService = emailService;\n    }\n\n    public void NotifyUser(int userId)\n    {\n        var user = _userRepository.GetUser(userId);\n        _emailService.SendEmail(user.Email, "Willkommen!");\n    }\n}
\n\n

Alles im DI-Container registrieren

Empfehlungen