Middle
Ce este injecția de dependențe (DI) în ASP.NET Core?
sobes.tech AI
Răspuns de la AI
Injecția de dependințe (DI) este un model de proiectare pentru inversiunea controlului (IoC), care permite crearea unui cod slab cuplat. În ASP.NET Core, DI este o funcție încorporată care facilitează gestionarea dependențelor între clase.
Componentele principale ale DI în ASP.NET Core:
- Servicii: Obiecte care oferă funcționalitate (de exemplu, clase de depozite, servicii de jurnalizare).
- Container DI: Obiect responsabil pentru rezolvarea dependențelor și crearea instanțelor de servicii.
- Ciclul de viață al serviciilor: Determină când și cum sunt create instanțele de servicii:
- Transient: O nouă instanță este creată la fiecare solicitare de serviciu.
- Scoped: O instanță pe fiecare solicitare (pentru aplicații web — pe fiecare solicitare HTTP).
- Singleton: O instanță este creată la prima solicitare și utilizată pe durata întregii aplicații.
Avantajele utilizării DI:
- Slabă cuplare: Clasele depind de abstracții (interfețe), nu de implementări concrete.
- Testabilitate: Este ușor să înlocuiți dependențele reale cu "mocks" sau "stubs" în timpul testelor unitare.
- Extensibilitate: Este ușor să înlocuiți implementările serviciilor fără a modifica codul dependent.
- Gestionarea dependențelor: Containerul DI gestionează ciclul de viață și crearea instanțelor.
Exemplu de înregistrare a serviciilor în Startup.cs (sau Program.cs în .NET 6+):
// În metoda ConfigureServices
public void ConfigureServices(IServiceCollection services)
{
// Înregistrarea unui serviciu cu ciclul de viață singleton
services.AddSingleton<ILogger, EmailLogger>();
// Înregistrarea unui serviciu cu ciclul de viață scoped
services.AddScoped<IDataRepository, SqlDataRepository>();
// Înregistrarea unui serviciu cu ciclul de viață transient
services.AddTransient<ITransientService, TransientService>();
// Înregistrarea controlerelor pentru injecția de dependențe
services.AddControllersWithViews();
}
Injecția de dependințe în constructorul controlerului:
```csharp
public class HomeController : Controller
{
private readonly ILogger _logger;
private readonly IDataRepository _repository;
// ASP.NET Core DI rezolvă și injectează automat aceste dependențe
public HomeController(ILogger logger, IDataRepository repository)
{
_logger = logger;
_repository = repository;
}
// ... acțiunile controlerului
}