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

  1. Služby: Objekt, ktorý poskytuje funkčnosť (napríklad triedy repozitárov, služby na logovanie).
  2. Kontajner DI: Objekt zodpovedný za riešenie závislostí a vytváranie inštancií služieb.
  3. 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
}