Sobes.tech
Middle

Mi az a függőséginjektálás (DI) az ASP.NET Core-ban?

sobes.tech MI

Válasz az MI-től

A függőségi injekció (DI) egy tervezési minta az irányítás fordított (IoC) számára, amely lehetővé teszi gyengén kapcsolt kód létrehozását. Az ASP.NET Core-ban a DI beépített funkció, amely megkönnyíti az osztályok közötti függőségek kezelését.

A DI fő összetevői az ASP.NET Core-ban:

  1. Szolgáltatások: Funkcionalitást nyújtó objektumok (pl. adattár osztályok, naplózási szolgáltatások).
  2. DI konténer: Az objektum, amely felelős a függőségek feloldásáért és a szolgáltatás példányok létrehozásáért.
  3. Szolgáltatások életciklusa: Meghatározza, mikor és hogyan készülnek a szolgáltatás példányok:
    • Transient: Minden szolgáltatás kérésnél új példány készül.
    • Scoped: Minden kérésnél egy példány (webalkalmazásoknál — minden HTTP kérésnél).
    • Singleton: Az első kérésnél készül, és az alkalmazás teljes életciklusa alatt használható.

A DI használatának előnyei:

  • Gyenge kapcsolódás: Az osztályok az absztrakciókra (interfészekre) támaszkodnak, nem konkrét megvalósításokra.
  • Tesztelhetőség: Könnyű helyettesíteni a valódi függőségeket "mocks" vagy "stubs" segítségével egységtesztek során.
  • Bővíthetőség: Könnyű helyettesíteni a szolgáltatások megvalósításait anélkül, hogy módosítanánk a rájuk támaszkodó kódot.
  • Függőségek kezelése: A DI konténer kezeli az életciklust és a példányok létrehozását.

Példa a szolgáltatások regisztrálására a Startup.cs-ben (vagy Program.cs-ben .NET 6+):

// A ConfigureServices metódusban
public void ConfigureServices(IServiceCollection services)
{
    // Singleton életciklussal rendelkező szolgáltatás regisztrálása
    services.AddSingleton<ILogger, EmailLogger>();

    // Scoped életciklussal rendelkező szolgáltatás regisztrálása
    services.AddScoped<IDataRepository, SqlDataRepository>();

    // Transient életciklussal rendelkező szolgáltatás regisztrálása
    services.AddTransient<ITransientService, TransientService>();

    // Kontrollerek regisztrálása függőséginjektáláshoz
    services.AddControllersWithViews();
}
A függőségek injektálása a kontrollerek konstruktorában:

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

    // Az ASP.NET Core DI automatikusan feloldja és injektálja ezeket a függőségeket
    public HomeController(ILogger logger, IDataRepository repository)
    {
        _logger = logger;
        _repository = repository;
    }

    // ... kontrollerek műveletei
}