Какие виды регистрации зависимостей вы знаете в IoC-контейнере ASP.NET Core?

«Какие виды регистрации зависимостей вы знаете в IoC-контейнере ASP.NET Core?» — вопрос из категории ASP.NET Core, который задают на 25% собеседований C# Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В ASP.NET Core Dependency Injection контейнер поддерживает следующие основные виды регистрации (времена жизни):

  1. Transient — создаётся новый экземпляр при каждом запросе зависимости. Подходит для лёгких, не имеющих состояния сервисов.

    services.AddTransient<IService, ServiceImplementation>();
  2. Scoped — один экземпляр создаётся в рамках одной области видимости (scope). В веб-приложении область видимости обычно соответствует одному HTTP-запросу.

    services.AddScoped<IService, ServiceImplementation>();
  3. Singleton — один экземпляр на всё время работы приложения. Используйте с осторожностью, учитывая потокобезопасность.

    services.AddSingleton<IService, ServiceImplementation>();

Также доступны дополнительные способы регистрации:

  • Регистрация экземпляра (Instance): Предоставление уже созданного объекта.
    services.AddSingleton<IService>(existingInstance);
  • Регистрация через фабрику (Factory): Позволяет управлять логикой создания экземпляра.
    services.AddTransient<IService>(serviceProvider => 
        new ServiceImplementation(serviceProvider.GetRequiredService<ILogger>())
    );

Сторонние контейнеры (например, Autofac) часто расширяют эти возможности, добавляя Keyed/Named регистрации (регистрация нескольких реализаций под разными ключами) и поддержку декораторов.