Sobes.tech
Middle

Mis on sõltuvuste süstimine (DI) ASP.NET Core'is?

sobes.tech AI

Vastus AI-lt

Sõltuvuste sisseviimine (DI) on disainimuster, mis võimaldab luua nõrga sidumisega koodi. ASP.NET Core'is on DI sisseehitatud funktsioon, mis võimaldab hõlpsasti hallata klasside vahelisi sõltuvusi.

DI põhikomponendid ASP.NET Core'is:

  1. Teenused: Objekti, mis pakub funktsionaalsust (näiteks hoidlate klassid, logimisteenused).
  2. DI konteiner: Objekti, mis vastutab sõltuvuste lahendamise ja teenuste eksemplaride loomise eest.
  3. Teenuste elutsükkel: Määrab, millal ja kuidas luuakse teenuste eksemplarid:
    • Transient: Uus eksemplar luuakse iga päringu puhul.
    • Scoped: Üks eksemplar luuakse iga päringu jaoks (veebirakenduste puhul — iga HTTP päringu jaoks).
    • Singleton: Üks eksemplar luuakse esimesel päringul ja kasutatakse kogu rakenduse tööaja jooksul.

DI kasutamise eelised:

  • Nõrk sidumine: Klassid sõltuvad abstraktsioonidest (liidestest), mitte konkreetsetest teostustest.
  • Testitavus: On lihtne asendada reaalsed sõltuvused "mokkide" või "stubbidega" üksustestestamisel.
  • Laiendatavus: On lihtne asendada teenuste teostusi ilma koodi muutmata, mis neist sõltub.
  • Sõltuvuste haldamine: DI konteiner haldab elutsüklit ja eksemplaride loomist.

Näide teenuste registreerimisest Startup.cs (või Program.cs .NET 6+):

// ConfigureServices meetodis
public void ConfigureServices(IServiceCollection services)
{
    // Registreeri teenus singleton elutsükliga
    services.AddSingleton<ILogger, EmailLogger>();

    // Registreeri teenus scoped elutsükliga
    services.AddScoped<IDataRepository, SqlDataRepository>();

    // Registreeri teenus transient elutsükliga
    services.AddTransient<ITransientService, TransientService>();

    // Registreeri kontrollere sõltuvuste sisseviimiseks
    services.AddControllersWithViews();
}

Sõltuvuste sisseviimine kontrolleri konstruktoris:

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

    // ASP.NET Core DI automaatselt lahendab ja sisestab need sõltuvused
    public HomeController(ILogger logger, IDataRepository repository)
    {
        _logger = logger;
        _repository = repository;
    }

    // ... kontrolleri tegevused
}