Dependency Injection-Container für C# (.NET): Vollständige Anleitung
\n\nDependency 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\nWas ist Dependency Injection?
\n\nDependency 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
Was ist ein DI-Container?
\n\nEin 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.
Grundlegende Konzepte des DI-Containers
\n\nDer 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
Einrichtung des DI-Containers in .NET
\n\nUm mit dem DI-Container zu arbeiten, muss das Paket Microsoft.Extensions.DependencyInjection installiert werden. Dies kann über NuGet erfolgen:
dotnet add package Microsoft.Extensions.DependencyInjection\n\nNach der Installation wird eine Instanz von ServiceCollection erstellt, in der alle Abhängigkeiten registriert werden:
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\nBeispiel für die Verwendung des DI-Containers
\n\nBetrachten wir ein reales Beispiel: eine Anwendung zur Benutzerverwaltung. Erstellen wir Schnittstellen und deren Implementierungen:
\n\npublic 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\nJetzt erstellen wir die Klasse UserService, die diese Abhängigkeiten verwendet:
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\nAlles im DI-Container registrieren