Middle
Čo je to injekcia závislostí (DI) v ASP.NET Core?
sobes.tech AI
Odpoveď od AI
Vkladanie závislostí (DI) je návrhový vzor pre invertovanie riadenia (IoC), ktorý umožňuje vytvárať slabé prepojený kód. V ASP.NET Core je DI vstavanou funkciou, ktorá umožňuje ľahko spravovať závislosti medzi triedami.
Hlavné komponenty DI v ASP.NET Core:
- Služby: Objekt, ktorý poskytuje funkčnosť (napríklad triedy repozitárov, služby na logovanie).
- Kontajner DI: Objekt zodpovedný za riešenie závislostí a vytváranie inštancií služieb.
- Doba života služieb: Určuje, kedy a ako sa vytvárajú inštancie služieb:
- Transient: Nová inštancia sa vytvorí pri každom požiadavku na službu.
- Scoped: Jeden inštancia sa vytvorí pre každý požiadavok (pre webové aplikácie — pre každý HTTP požiadavok).
- Singleton: Jeden inštancia sa vytvorí pri prvom požiadavku a používa sa počas celého behu aplikácie.
Výhody používania DI:
- Slabé prepojenie: Triedy závisia od abstrakcií (rozhraní), nie od konkrétnych implementácií.
- Testovateľnosť: Jednoducho nahradiť skutočné závislosti "záškami" (mocks) alebo "stubmi" (stubs) pri jednotkovom testovaní.
- Rozšíriteľnosť: Jednoducho nahradiť implementácie služieb bez zmeny kódu, ktorý na nich závisí.
- Spravovateľnosť závislostí: Kontajner DI spravuje životný cyklus a vytváranie inštancií.
Príklad registrácie služieb v Startup.cs (alebo Program.cs v .NET 6+):
// V metóde ConfigureServices
public void ConfigureServices(IServiceCollection services)
{
// Registrácia služby s singleton časom života
services.AddSingleton<ILogger, EmailLogger>();
// Registrácia služby s scoped časom života
services.AddScoped<IDataRepository, SqlDataRepository>();
// Registrácia služby s transient časom života
services.AddTransient<ITransientService, TransientService>();
// Registrácia kontrolerov na vkladanie závislostí do nich
services.AddControllersWithViews();
}
Vkladanie závislostí do konštruktora kontroléra:
```csharp
public class HomeController : Controller
{
private readonly ILogger _logger;
private readonly IDataRepository _repository;
// ASP.NET Core DI automaticky rieši a vkladá tieto závislosti
public HomeController(ILogger logger, IDataRepository repository)
{
_logger = logger;
_repository = repository;
}
// ... akcie kontroléra
}