Condivisione della tecnologia

Contenitore IOC C#, inserimento delle dipendenze e inversione del controllo

2024-07-12

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

Inversione di controllo (IoC)

definizione : L'inversione del controllo è un principio di progettazione che inverte il flusso di controllo nella programmazione tradizionale. Nei modelli di programmazione tradizionali, le dipendenze tra i componenti vengono create e mantenute internamente dai componenti stessi. Nell'inversione della modalità di controllo, questa dipendenza è gestita da un contenitore esterno (come il framework Spring, Microsoft.Extensions.DependencyInjection in .NET, ecc.). Il componente non è più responsabile delle proprie dipendenze, ma inietta tutte le dipendenze attraverso il contenitore esterno dipendenze richieste.

idea principale: sposta la creazione degli oggetti e la gestione delle dipendenze tra gli stessi dagli oggetti stessi a contenitori esterni.

vantaggio

  • Ridurre l'accoppiamento: le dipendenze tra i componenti non sono più codificate, quindi le implementazioni dei componenti possono essere sostituite più facilmente, migliorando la flessibilità e la manutenibilità del sistema.
  • Migliorare la modularità: I singoli componenti possono essere sviluppati e testati in modo indipendente perché non si basano su implementazioni specifiche, ma su interfacce o classi astratte.
  • Facile da testare: poiché le dipendenze tra i componenti sono esternalizzate, è più semplice utilizzare oggetti fittizi o stub di test per simulare le dipendenze per i test unitari.

Inserimento delle dipendenze (DI)

definizione : L'iniezione delle dipendenze è un modo specifico per ottenere l'inversione del controllo. Implica il passaggio delle dipendenze (servizi o oggetti) alle classi invece di lasciare che le classi le creino da sole.

Metodo per realizzare

  • iniezione del costruttore : Le dipendenze vengono fornite tramite il costruttore della classe. Questa è la forma più comune e consigliata di DI in C#.
  • Iniezione di proprietà : assegna le dipendenze tramite le proprietà pubbliche della classe. Questo approccio fornisce flessibilità ma può esporre lo stato interno e ridurre l'incapsulamento.
  • metodo di iniezione : passa le dipendenze attraverso i parametri del metodo. Adatto per inserire solo le dipendenze richieste da un metodo specifico.

contenitore del CIO

definizione Il contenitore :IOC è un framework per la gestione del ciclo di vita e delle dipendenze degli oggetti. Crea automaticamente oggetti in base alla configurazione (come file XML, annotazioni o configurazione del codice) e inserisce dipendenze in questi oggetti.

effetto

  • Creazione di oggetti: crea automaticamente istanze di oggetti in base alla configurazione.
  • iniezione di dipendenza: Iniettare dipendenze negli oggetti per ottenere l'inversione del controllo.
  • gestione del ciclo di vita: gestire il ciclo di vita degli oggetti, inclusa la creazione, la distruzione e il riciclaggio delle risorse.

Utilizza i contenitori IOC per gestire le dipendenze

In C# è possibile usare diversi contenitori IOC per gestire le dipendenze, ad esempio Microsoft.Extensions.DependencyInjection (il contenitore DI incorporato di .NET Core e versioni successive), Autofac e così via. Di seguito viene preso Microsoft.Extensions.DependencyInjection come esempio per introdurre come utilizzare i contenitori IOC per gestire le dipendenze nei progetti C#.

Passaggio 1: registrarsi per il servizio

I servizi vengono in genere utilizzati nelle applicazioni .NETProgram.csOStartup.cs(per progetti ASP.NET Core) utilizzato inIServiceCollectioninterfaccia per registrarsi.

public void ConfigureServices(IServiceCollection services)
{
    services.AddSingleton<IMyService, MyService>(); // 将MyService注册为单例服务
    // 其他服务注册
}
  • 1
  • 2
  • 3
  • 4
  • 5
Passaggio 2: inserire le dipendenze

Iniettare dipendenze nel controller, nel servizio o in qualsiasi altra classe tramite il costruttore.

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

Nell'esempio sopra,MyControllerLa classe viene iniettata tramite il costruttoreIMyServiceL'implementazione dell'interfaccia (ad es.MyService Tipo).In questo modo, quandoMyControllerUna volta creato, il contenitore IOC verrà automaticamenteIMyServiceL'implementazione viene inserita nel costruttore.

Precauzioni
  • Utilizzare astrazioni basate sull'interfaccia: Preferire interfacce o classi astratte per i tipi dipendenti per migliorare la flessibilità e la testabilità.
  • Evita l'uso eccessivo di singleton: i servizi Singleton devono essere utilizzati con cautela per evitare problemi legati allo stato.
  • Monitorare il ciclo di vita degli oggetti: comprendere il ciclo di vita delle dipendenze (singleton, ambito, transitorio) per gestire in modo efficace l'utilizzo delle risorse.