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:
- Teenused: Objekti, mis pakub funktsionaalsust (näiteks hoidlate klassid, logimisteenused).
- DI konteiner: Objekti, mis vastutab sõltuvuste lahendamise ja teenuste eksemplaride loomise eest.
- 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
}