Sobes.tech
Middle

Cos'è l'iniezione delle dipendenze (DI) in ASP.NET Core?

sobes.tech AI

Risposta dell'AI

L'iniezione delle dipendenze (DI) è un pattern di progettazione per l'inversione del controllo (IoC), che consente di creare codice debolmente accoppiato. In ASP.NET Core, DI è una funzionalità integrata che facilita la gestione delle dipendenze tra le classi.

Componenti principali di DI in ASP.NET Core:

  1. Servizi: Oggetti che forniscono funzionalità (ad esempio, classi di repository, servizi di logging).
  2. Contenitore DI: Oggetto responsabile di risolvere le dipendenze e creare istanze di servizi.
  3. Ciclo di vita dei servizi: Determina quando e come vengono create le istanze dei servizi:
    • Transient: Una nuova istanza viene creata ad ogni richiesta di servizio.
    • Scoped: Un'istanza per ogni richiesta (per applicazioni web, per ogni richiesta HTTP).
    • Singleton: Un'istanza viene creata alla prima richiesta e usata per tutta la durata dell'applicazione.

Vantaggi dell'uso di DI:

  • Coppia debole: Le classi dipendono da astrazioni (interfacce), non da implementazioni concrete.
  • Testabilità: È facile sostituire le dipendenze reali con "mocks" o "stubs" durante i test unitari.
  • Estensibilità: È facile sostituire le implementazioni dei servizi senza modificare il codice dipendente.
  • Gestione delle dipendenze: Il contenitore DI gestisce il ciclo di vita e la creazione delle istanze.

Esempio di registrazione dei servizi in Startup.cs (o Program.cs in .NET 6+):

// Nel metodo ConfigureServices
public void ConfigureServices(IServiceCollection services)
{
    // Registrazione di un servizio con ciclo di vita singleton
    services.AddSingleton<ILogger, EmailLogger>();

    // Registrazione di un servizio con ciclo di vita scoped
    services.AddScoped<IDataRepository, SqlDataRepository>();

    // Registrazione di un servizio con ciclo di vita transient
    services.AddTransient<ITransientService, TransientService>();

    // Registrazione dei controller per l'iniezione delle dipendenze
    services.AddControllersWithViews();
}
Iniezione delle dipendenze nel costruttore del controller:

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

    // ASP.NET Core DI risolve e inietta automaticamente queste dipendenze
    public HomeController(ILogger logger, IDataRepository repository)
    {
        _logger = logger;
        _repository = repository;
    }

    // ... azioni del controller
}