Sobes.tech
Middle

Co je to injekce závislostí (DI) v ASP.NET Core?

sobes.tech AI

Odpověď od AI

Vstřikování závislostí (DI) je návrhový vzor pro inverzi řízení (IoC), který umožňuje vytvářet slabě propojený kód. V ASP.NET Core je DI vestavěnou funkcí, která usnadňuje správu závislostí mezi třídami.

Hlavní komponenty DI v ASP.NET Core:

  1. Služby: Objekty poskytující funkčnost (například třídy repozitářů, služby logování).
  2. DI kontejner: Objekt odpovědný za řešení závislostí a tvorbu instancí služeb.
  3. Životní cyklus služeb: Určuje, kdy a jak jsou vytvářeny instance služeb:
    • Transient: Nová instance je vytvořena při každé žádosti o službu.
    • Scoped: Jedna instance na každou žádost (pro webové aplikace — na každý HTTP požadavek).
    • Singleton: Instance je vytvořena při první žádosti a používá se po celou dobu běhu aplikace.

Výhody používání DI:

  • Slabé propojení: Třídy závisí na abstrakcích (rozhraních), nikoliv na konkrétních implementacích.
  • Testovatelnost: Je snadné nahradit reálné závislosti "mocks" nebo "stubs" při jednotkovém testování.
  • Rozšiřitelnost: Je snadné nahradit implementace služeb bez změny kódu, který na nich závisí.
  • Správa závislostí: Kontejner DI spravuje životní cyklus a tvorbu instancí.

Příklad registrace služeb v Startup.cs (nebo Program.cs v .NET 6+):

// V metodě ConfigureServices
public void ConfigureServices(IServiceCollection services)
{
    // Registrace služby s životním cyklem singleton
    services.AddSingleton<ILogger, EmailLogger>();

    // Registrace služby s životním cyklem scoped
    services.AddScoped<IDataRepository, SqlDataRepository>();

    // Registrace služby s životním cyklem transient
    services.AddTransient<ITransientService, TransientService>();

    // Registrace kontrolerů pro injekci závislostí
    services.AddControllersWithViews();
}
Vstřikování závislostí v konstruktoru kontroleru:

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

    // ASP.NET Core DI automaticky řeší a vkládá tyto závislosti
    public HomeController(ILogger logger, IDataRepository repository)
    {
        _logger = logger;
        _repository = repository;
    }

    // ... akce kontroleru
}