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

  1. Usługi: Obiekty zapewniające funkcjonalność (np. klasy repozytoriów, usługi logowania).
  2. Kontener DI: Obiekt odpowiedzialny za rozwiązywanie zależności i tworzenie instancji usług.
  3. 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
}