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:
- Szolgáltatások: Funkcionalitást nyújtó objektumok (pl. adattár osztályok, naplózási szolgáltatások).
- 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.
- 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
}