C# Dependency Injection: Ein Leitfaden zur Implementierung mit Autofac

C# Dependency Injection: Ein Leitfaden zur Implementierung mit Autofac
Aktualisiert am 8.10.2024
Tobias Bück

Tobias Bück

Hallo! Ich bin Tobias Bück, Gründer von Softoft. Als Informatiker teile ich auf meinem Blog Einblicke in Softwareentwicklung, insbesondere das OTOBO Ticketsystem, sowie Automatisierungstools wie UIPath und Zapier.

C# Dependency Injection: Ein umfassender Leitfaden

In diesem Artikel erfährst du, wie du Dependency Injection in C# umsetzt, insbesondere unter Verwendung der Autofac-Bibliothek. Wir werden die Vorteile dieses Konzepts erläutern und dir zeigen, wie du deinen Code durch den Einsatz von Autofac flexibler, wartungsfreundlicher und besser testbar gestalten kannst.

Was ist Dependency Injection in C#?

Dependency Injection (DI) ist ein zentrales Muster in der Softwareentwicklung, das dazu dient, Abhängigkeiten zwischen Klassen zu minimieren und die Kopplung (Loose Coupling) zu reduzieren. In C# wird DI häufig verwendet, um den Code modularer zu gestalten, da Abhängigkeiten durch Schnittstellen bereitgestellt und verwaltet werden.

Vorteile der Dependency Injection in C#

  • Reduzierte Kopplung: Klassen kommunizieren über Schnittstellen, was Flexibilität und Erweiterbarkeit fördert.
  • Bessere Testbarkeit: Abhängigkeiten lassen sich leicht mocken oder ersetzen, was Unit-Tests erheblich vereinfacht.
  • Erhöhte Wartbarkeit: Der Code wird klarer strukturiert und Änderungen können einfacher vorgenommen werden.

C# Dependency Injection Beispiel

Um die Anwendung von Dependency Injection in C# zu verdeutlichen, entwickeln wir ein Wettervorhersage-System. Dieses System verwendet zwei verschiedene Vorhersager: „WeatherSatellite“ und „WeatherStation“, die beide die Wettervorhersage implementieren.

Mehr über objektorientierte Programmierung in C#: Objektorientierte Programmierung in C#.

Objekt Orientiertes Programm ohne DI

public class WeatherSatellite
{
    public int GetTemperature() => 20;
}

public class WeatherStation
{
    public int GetTemperature() => 22;
}

class Person
{
    private WeatherSatellite _weatherSatellite = new WeatherSatellite();
}

UML-Diagramm: Design ohne Dependency Injection

UML Diagramm C#: Beispiel ohne Dependency Injection
UML Diagramm C#: Beispiel ohne Dependency Injection

Problem in OOP ohne Dependency Injection

Die Person-Klasse entscheidet, welche Vorhersage methode verwendet wird, was zu starker Kopplung führt. Jede Änderung an der Implementierung erfordert Anpassungen in der Klasse.

1. Lösungsschritt: Einführung von Interfaces

Um die Abhängigkeiten zu reduzieren, definieren wir ein Interface IWeatherForecasting:

public interface IWeatherForecasting
{
    int GetTemperature();
}

class Person
{
    private IWeatherForecasting _weatherForecasting;
    public Person(IWeatherForecasting weatherForecasting)
    {
        _weatherForecasting = weatherForecasting;
    }
}

UML-Diagramm: Interface-Implementierung ohne Dependency Injection

C# Dependency Injection UML Diagramm - Interface
C# Dependency Injection UML Diagramm - Interface

Problem mit Dependencies

Die Person-Klasse kennt weiterhin die konkrete Implementierung und wählt, welche Wettervorhersage genutzt wird. Das widerspricht dem Dependency Injection-Prinzip.

2.Lösungsschritt Dependency Injection in C# mit Autofac

Die Lösung für dieses Problem besteht darin, Autofac zu verwenden. Mit diesem DI-Container können wir die Abhängigkeiten automatisch injizieren lassen.

Code-Beispiel: Dependency Injection in C# mit Autofac

class Programm
{
    public static void Main()
    {
        var builder = new ContainerBuilder();
        
        builder.RegisterInstance(new WeatherSatellite()).As<IWeatherForecasting>();
        
        var container = builder.Build();
        using(var scope = container.BeginLifetimeScope())
        {
            var weatherForecaster = scope.Resolve<IWeatherForecasting>();
            var person = new Person(weatherForecaster);
        }
    }
}

Erklärung

  • ContainerBuilder: Erstellt einen DI-Container, der die Abhängigkeiten auflöst.
  • RegisterInstance: Registriert WeatherSatellite als Implementierung von IWeatherForecasting.
  • Resolve: Löst die Abhängigkeit auf und stellt sie der Person-Klasse zur Verfügung.

UML-Diagramm: Design mit Dependency Injection in C#

C# Dependency Injection UML Diagramm - Dependency Container
C# Dependency Injection UML Diagramm - Dependency Container

Erweiterung des Containers mit Autofac

Zusätzlich können wir die Person-Klasse selbst durch den Autofac-Container injizieren lassen:

  public static void Main()
  {
      var builder = new ContainerBuilder();
      
      builder.RegisterInstance(new WeatherSatellite()).As<IWeatherForecasting>();
      builder.RegisterType<Person>();
      
      var container = builder.Build();
      using var scope = container.BeginLifetimeScope();
      var person = scope.Resolve<Person>();
  }

Vorteil von Dependency Injection in C#

Durch den Einsatz von Dependency Injection wird die Person-Klasse völlig unabhängig von der konkreten Implementierung der Wettervorhersage. Änderungen an der Vorhersagemethode können einfach im DI-Container vorgenommen werden, ohne den Code in der Person -Klasse zu ändern.

Häufig gestellte Fragen zur Dependency Injection in C#

Was ist der Unterschied zwischen Konstruktor-Injection und Setter-Injection?

  • Konstruktor-Injection: Die Abhängigkeiten werden über den Konstruktor bereitgestellt. Diese Methode wird bevorzugt, da sie sicherstellt, dass die Klasse nicht ohne ihre Abhängigkeiten instanziiert wird.

  • Setter-Injection: Abhängigkeiten werden über Setter-Methoden bereitgestellt, was mehr Flexibilität bietet, jedoch das Risiko birgt, dass eine Klasse ohne vollständige Abhängigkeiten verwendet wird.

Warum Autofac anstelle von manueller Dependency Injection verwenden?

Autofac und ähnliche Dependency Injection-Container bieten viele Vorteile, wie die automatische Verwaltung von Abhängigkeiten, Unterstützung für komplexe Szenarien (z.B. Lebenszyklus-Management) und eine klare Trennung der Zuständigkeiten.

Fazit

Dependency Injection in C# bietet zahlreiche Vorteile wie Modularität, Flexibilität und leichtere Wartbarkeit. Durch den Einsatz eines DI-Containers wie Autofac wird die Verwaltung von Abhängigkeiten automatisiert und vereinfacht, was die Codequalität und Testbarkeit verbessert.

Weitere Ressourcen

CookieFirst Logo

Wir verwenden Cookies

Wir können diese zur Analyse unserer Besucherdaten platzieren, um unsere Webseite zu verbessern, personalisierte Inhalte anzuzeigen und Ihnen ein großartiges Webseiten-Erlebnis zu bieten. Für weitere Informationen zu den von uns verwendeten Cookies öffnen Sie die Einstellungen.