Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Что такое 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 — правильный выбор для сервисов, работающих с БД и состоянием запроса.