Sobes.tech
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:

  1. Servicii: Obiecte care oferă funcționalitate (de exemplu, clase de depozite, servicii de jurnalizare).
  2. Container DI: Obiect responsabil pentru rezolvarea dependențelor și crearea instanțelor de servicii.
  3. 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
}