← Назад к вопросам

Что такое Scoped?

2.2 Middle🔥 191 комментариев
#Dependency Injection и IoC

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое Scoped?

Scoped — это одна из трёх основных lifetimes (время жизни) объектов в системе Dependency Injection в .NET. Scoped означает, что новый экземпляр сервиса создаётся один раз на HTTP-запрос в ASP.NET Core.

Три основных lifetime'а

1. Transient — новый экземпляр каждый раз

services.AddTransient<IRepository, Repository>();

Каждый раз, когда контейнер DI создаёт экземпляр, он создаёт новый объект. Идеален для stateless сервисов без состояния.

2. Scoped — один экземпляр на запрос

services.AddScoped<IRepository, Repository>();

Новый экземпляр создаётся в начале каждого HTTP-запроса и удаляется в конце. Идеален для DbContext и сервисов, работающих с БД.

3. Singleton — один экземпляр для всего приложения

services.AddSingleton<IRepository, Repository>();

Объект создаётся один раз при первом обращении и живёт до завершения приложения. Идеален для конфигурации и кэша.

Пример с Scoped и DbContext

public void ConfigureServices(IServiceCollection services)
{
    services.AddScoped<IRepository, UserRepository>();
    services.AddScoped<DbContext, AppDbContext>();
    services.AddScoped<IUserService, UserService>();
}

[ApiController]
[Route("api/v1/users")]
public class UserController : ControllerBase
{
    private readonly IUserService _userService;

    public UserController(IUserService userService)
    {
        _userService = userService;
    }

    [HttpGet("{id}")]
    public async Task<IActionResult> GetUser(int id)
    {
        var user = await _userService.GetUserByIdAsync(id);
        return Ok(user);
    }
}

Почему Scoped для DbContext?

EF Core DbContext должен быть Scoped, потому что:

  • Change tracking — контекст отслеживает изменения сущностей
  • Identity map — в рамках одного запроса нужно получать один и тот же объект из БД
  • Конфликты потоков — DbContext не потокобезопасен, Scoped гарантирует, что каждый запрос имеет свой контекст

Сравнение lifetimes

LifetimeСозданиеПримеры
TransientКаждый разStateless утилиты
ScopedНа каждый запросDbContext, Repository
SingletonОдин разConfiguration, Cache

Итоговый результат: Scoped — правильный выбор для сервисов, работающих с БД и состоянием запроса.