Sobes.tech
Middle
150
questionbank

Что такое внедрение зависимостей (DI) в ASP.NET Core?

Answer from AI

sobes.tech AI

Это шаблон проектирования, при котором объект или функция получают свои зависимости извне, а не создают их сами. В ASP.NET Core DI интегрирован в фреймворк и используется для управления жизненным циклом и связями между компонентами приложения.

Преимущества использования DI в ASP.NET Core:

  • Тестируемость: Легче создавать mock-объекты и stub-объекты для тестирования зависимостей.
  • Поддерживаемость: Упрощает модификацию и расширение функциональности приложения.
  • Слабая связанность: Компоненты меньше зависят друг от друга.

ASP.NET Core предоставляет встроенный контейнер DI (IServiceProvider), который позволяет регистрировать и разрешать сервисы. Сервисы регистрируются в методе ConfigureServices класса Startup.

Пример регистрации сервиса с различными временами жизни:

// Startup.cs
public void ConfigureServices(IServiceCollection services)
{
    // Сервис создается каждый раз при запросе
    services.AddTransient<ITransientService, TransientService>();

    // Сервис создается один раз при первом запросе и переиспользуется
    services.AddScoped<IScopedService, ScopedService>();

    // Сервис создается один раз за все время работы приложения
    services.AddSingleton<ISingletonService, SingletonService>();
}

Пример использования зарегистрированного сервиса в контроллере:

// HomeController.cs
public class HomeController : Controller
{
    private readonly ITransientService _transientService;
    private readonly IScopedService _scopedService;
    private readonly ISingletonService _singletonService;

    // Зависимости внедряются через конструктор
    public HomeController(ITransientService transientService, IScopedService scopedService, ISingletonService singletonService)
    {
        _transientService = transientService;
        _scopedService = scopedService;
        _singletonService = singletonService;
    }

    public IActionResult Index()
    {
        // Использование сервисов
        var transientId = _transientService.GetId();
        var scopedId = _scopedService.GetId();
        var singletonId = _singletonService.GetId();

        return View();
    }
}

Типы времени жизни сервисов:

Время жизни Описание
Transient Создается новый экземпляр сервиса при каждом запросе его разрешения.
Scoped Создается один экземпляр сервиса на каждый входящий HTTP-запрос.
Singleton Создается один экземпляр сервиса за все время работы приложения.