Sobes.tech
Middle

Was ist Dependency Injection (DI) in ASP.NET Core?

sobes.tech KI

Antwort von AI

Die Dependency Injection (DI) ist ein Entwurfsmuster für die Inversion of Control (IoC), das die Erstellung von lose gekoppeltem Code ermöglicht. In ASP.NET Core ist DI eine integrierte Funktion, die die Verwaltung von Abhängigkeiten zwischen Klassen erleichtert.

Hauptkomponenten von DI in ASP.NET Core:

  1. Dienste: Objekte, die Funktionalitäten bereitstellen (z.B. Repository-Klassen, Logging-Services).
  2. DI-Container: Objekt, das für die Auflösung von Abhängigkeiten und die Erstellung von Service-Instanzen verantwortlich ist.
  3. Lebenszyklus der Dienste: Bestimmt, wann und wie Service-Instanzen erstellt werden:
    • Transient: Eine neue Instanz wird bei jeder Service-Anfrage erstellt.
    • Scoped: Eine Instanz pro Anfrage (für Webanwendungen – pro HTTP-Anfrage).
    • Singleton: Eine Instanz wird bei der ersten Anfrage erstellt und während der gesamten Laufzeit der Anwendung verwendet.

Vorteile der Verwendung von DI:

  • Schwache Kopplung: Klassen hängen von Abstraktionen (Interfaces) ab, nicht von konkreten Implementierungen.
  • Testbarkeit: Es ist einfach, reale Abhängigkeiten durch "Mocks" oder "Stubs" bei Unit-Tests zu ersetzen.
  • Erweiterbarkeit: Es ist einfach, Service-Implementierungen zu ersetzen, ohne den abhängigen Code zu ändern.
  • Verwaltbarkeit der Abhängigkeiten: Der DI-Container verwaltet den Lebenszyklus und die Erstellung von Instanzen.

Beispiel für die Registrierung von Diensten in Startup.cs (oder Program.cs in .NET 6+):

// Im ConfigureServices-Methode
public void ConfigureServices(IServiceCollection services)
{
    // Registrierung eines Dienstes mit Singleton-Lebenszyklus
    services.AddSingleton<ILogger, EmailLogger>();

    // Registrierung eines Dienstes mit Scoped-Lebenszyklus
    services.AddScoped<IDataRepository, SqlDataRepository>();

    // Registrierung eines Dienstes mit Transient-Lebenszyklus
    services.AddTransient<ITransientService, TransientService>();

    // Registrierung von Controllern für die Dependency Injection
    services.AddControllersWithViews();
}
Dependency Injection im Konstruktor des Controllers:

```csharp
public class HomeController : Controller
{
    private readonly ILogger _logger;
    private readonly IDataRepository _repository;

    // ASP.NET Core DI löst diese Abhängigkeiten automatisch auf und injiziert sie
    public HomeController(ILogger logger, IDataRepository repository)
    {
        _logger = logger;
        _repository = repository;
    }

    // ... Aktionen des Controllers
}