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:
- Servizi: Oggetti che forniscono funzionalità (ad esempio, classi di repository, servizi di logging).
- Contenitore DI: Oggetto responsabile di risolvere le dipendenze e creare istanze di servizi.
- 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
}