Technologieaustausch

C#-IOC-Container, Abhängigkeitsinjektion und Umkehrung der Kontrolle

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Umkehrung der Kontrolle (IoC)

Definition : Die Umkehrung der Kontrolle ist ein Entwurfsprinzip, das den Kontrollfluss in der traditionellen Programmierung umkehrt. In herkömmlichen Programmiermodellen werden Abhängigkeiten zwischen Komponenten intern von den Komponenten selbst erstellt und verwaltet. Im Inversion-of-Control-Modus wird diese Abhängigkeit von einem externen Container verwaltet (z. B. dem Spring-Framework, Microsoft.Extensions.DependencyInjection in .NET usw.). Die Komponente ist nicht mehr für ihre eigenen Abhängigkeiten verantwortlich, sondern injiziert alle Abhängigkeiten über den externen Container.

Hauptidee: Verlagert die Erstellung von Objekten und die Verwaltung von Abhängigkeiten zwischen ihnen von den Objekten selbst in externe Container.

Vorteil

  • Kopplung reduzieren: Abhängigkeiten zwischen Komponenten sind nicht mehr fest codiert, sodass Komponentenimplementierungen einfacher ersetzt werden können, was die Systemflexibilität und Wartbarkeit verbessert.
  • Verbessern Sie die Modularität: Einzelne Komponenten können unabhängig voneinander entwickelt und getestet werden, da sie nicht auf bestimmten Implementierungen, sondern auf abstrakten Schnittstellen oder abstrakten Klassen basieren.
  • Einfach zu testen: Da Abhängigkeiten zwischen Komponenten externalisiert werden, ist es einfacher, Scheinobjekte oder Test-Stubs zu verwenden, um Abhängigkeiten für Unit-Tests zu simulieren.

Abhängigkeitsinjektion (DI)

Definition : Abhängigkeitsinjektion ist eine spezielle Methode, um eine Umkehrung der Kontrolle zu erreichen. Dabei geht es darum, Abhängigkeiten (Dienste oder Objekte) an Klassen zu übergeben, anstatt sie von den Klassen selbst erstellen zu lassen.

Methode zur Verwirklichung

  • Konstruktorinjektion : Abhängigkeiten werden über den Konstruktor der Klasse bereitgestellt. Dies ist die häufigste und empfohlene Form von DI in C#.
  • Immobilienspritze : Weisen Sie Abhängigkeiten über öffentliche Eigenschaften der Klasse zu. Dieser Ansatz bietet Flexibilität, kann jedoch den internen Zustand offenlegen und die Kapselung reduzieren.
  • Methode Injektion : Abhängigkeiten über Methodenparameter übergeben. Geeignet zum Einfügen nur von Abhängigkeiten, die für eine bestimmte Methode erforderlich sind.

IOC-Container

Definition Der :IOC-Container ist ein Framework zur Verwaltung des Objektlebenszyklus und der Abhängigkeiten. Es erstellt automatisch Objekte basierend auf der Konfiguration (z. B. XML-Dateien, Anmerkungen oder Codekonfiguration) und fügt Abhängigkeiten in diese Objekte ein.

Wirkung

  • Objekterstellung: Objektinstanzen basierend auf der Konfiguration automatisch erstellen.
  • Abhängigkeitsspritze: Abhängigkeiten in Objekte einfügen, um eine Umkehrung der Kontrolle zu erreichen.
  • Lebenszyklusverwaltung: Verwalten Sie den Lebenszyklus von Objekten, einschließlich der Erstellung, Zerstörung und Wiederverwertung von Ressourcen.

Verwenden Sie IOC-Container, um Abhängigkeiten zu verwalten

In C# können Sie eine Vielzahl von IOC-Containern zum Verwalten von Abhängigkeiten verwenden, z. B. Microsoft.Extensions.DependencyInjection (der integrierte DI-Container von .NET Core und späteren Versionen), Autofac usw. Im Folgenden wird Microsoft.Extensions.DependencyInjection als Beispiel verwendet, um die Verwendung von IOC-Containern zum Verwalten von Abhängigkeiten in C#-Projekten vorzustellen.

Schritt 1: Registrieren Sie sich für den Service

Dienste werden typischerweise in .NET-Anwendungen verwendetProgram.csoderStartup.cs(für ASP.NET Core-Projekte) verwendet inIServiceCollectionSchnittstelle zur Registrierung.

public void ConfigureServices(IServiceCollection services)
{
    services.AddSingleton<IMyService, MyService>(); // 将MyService注册为单例服务
    // 其他服务注册
}
  • 1
  • 2
  • 3
  • 4
  • 5
Schritt 2: Abhängigkeiten einfügen

Fügen Sie über den Konstruktor Abhängigkeiten in Controller, Dienste oder andere Klassen ein.

public class MyController : Controller
{
    private readonly IMyService _myService;

    public MyController(IMyService myService)
    {
        _myService = myService;
    }

    // ... 控制器的其他代码
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

Im obigen BeispielMyControllerDie Klasse wird über den Konstruktor eingefügtIMyServiceDie Implementierung der Schnittstelle (d. h.MyService Art).Auf diese Weise, wannMyControllerBei der Erstellung wird der IOC-Container automatisch erstelltIMyServiceDie Implementierung wird in den Konstruktor eingefügt.

Vorsichtsmaßnahmen
  • Verwenden Sie schnittstellenbasierte Abstraktionen: Bevorzugen Sie Schnittstellen oder abstrakte Klassen für abhängige Typen, um die Flexibilität und Testbarkeit zu verbessern.
  • Vermeiden Sie den übermäßigen Gebrauch von Singletons: Singleton-Dienste sollten mit Vorsicht verwendet werden, um zustandsbezogene Probleme zu vermeiden.
  • Überwachen Sie den Objektlebenszyklus: Verstehen Sie den Lebenszyklus von Abhängigkeiten (Singleton, Scope, Transient), um die Ressourcennutzung effektiv zu verwalten.