Middle
Czym jest wstrzykiwanie zależności (DI) w ASP.NET Core?
sobes.tech AI
Odpowiedź od AI
Wstrzykiwanie zależności (DI) to wzorzec projektowy dla odwrócenia kontroli (IoC), który umożliwia tworzenie słabo powiązanego kodu. W ASP.NET Core DI jest funkcją wbudowaną, ułatwiającą zarządzanie zależnościami między klasami.
Główne komponenty DI w ASP.NET Core:
- Usługi: Obiekty zapewniające funkcjonalność (np. klasy repozytoriów, usługi logowania).
- Kontener DI: Obiekt odpowiedzialny za rozwiązywanie zależności i tworzenie instancji usług.
- Czas życia usług: Określa, kiedy i jak tworzone są instancje usług:
- Transient: Nowa instancja tworzona przy każdym żądaniu usługi.
- Scoped: Jedna instancja na każde żądanie (dla aplikacji webowych — na każde żądanie HTTP).
- Singleton: Instancja tworzona przy pierwszym żądaniu i używana przez cały czas działania aplikacji.
Zalety korzystania z DI:
- Słabe powiązanie: Klasy zależą od abstrakcji (interfejsów), a nie od konkretnych implementacji.
- Testowalność: Łatwo zastąpić rzeczywiste zależności "mockami" lub "stubami" podczas testów jednostkowych.
- Rozszerzalność: Łatwo zastąpić implementacje usług bez zmiany kodu zależnego.
- Zarządzanie zależnościami: Kontener DI zarządza cyklem życia i tworzeniem instancji.
Przykład rejestracji usług w Startup.cs (lub Program.cs w .NET 6+):
// W metodzie ConfigureServices
public void ConfigureServices(IServiceCollection services)
{
// Rejestracja usługi z cyklem życia singleton
services.AddSingleton<ILogger, EmailLogger>();
// Rejestracja usługi z cyklem życia scoped
services.AddScoped<IDataRepository, SqlDataRepository>();
// Rejestracja usługi z cyklem życia transient
services.AddTransient<ITransientService, TransientService>();
// Rejestracja kontrolerów do wstrzykiwania zależności
services.AddControllersWithViews();
}
Wstrzykiwanie zależności w konstruktorze kontrolera:
```csharp
public class HomeController : Controller
{
private readonly ILogger _logger;
private readonly IDataRepository _repository;
// ASP.NET Core DI automatycznie rozwiązuje i wstrzykuje te zależności
public HomeController(ILogger logger, IDataRepository repository)
{
_logger = logger;
_repository = repository;
}
// ... akcje kontrolera
}