Ответ
Время жизни (lifetime) объекта в DI-контейнере ASP.NET Core определяется при регистрации сервиса и влияет на то, как часто создается новый экземпляр.
Существует три основных варианта:
- Transient (Временный) – новый экземпляр создается каждый раз, когда сервис запрашивается из контейнера. Подходит для легковесных, stateless-сервисов.
services.AddTransient<IMyService, MyService>(); - Scoped (В рамках области) – один экземпляр создается на одну область (scope). В веб-приложении область по умолчанию — это один HTTP-запрос. Это самый частый выбор для сервисов, работающих с контекстом запроса (например, DbContext в Entity Framework Core).
services.AddScoped<IMyRepository, MyRepository>(); - Singleton (Одиночка) – один экземпляр создается на все время работы приложения. Используется для сервисов, которые должны быть общими для всех запросов (например, кэш в памяти, логгер, конфигурация).
services.AddSingleton<IMemoryCache, MemoryCache>();
Критически важные моменты:
- Несоответствие времен жизни: Сервис с более коротким временем жизни не должен зависеть от сервиса с более долгим. Например,
Scopedсервис не может зависеть отTransientсервиса, если этотTransientсервис не был зарегистрирован правильно. - Особенности
Scopedвне веб-контекста: В консольных приложениях или фоновых задачах область видимости нужно создавать вручную черезIServiceScopeFactory.CreateScope(). - Потокобезопасность:
Singletonсервисы должны быть спроектированы как потокобезопасные. - Утечки памяти:
Singleton, который хранит ссылки наScopedсервисы или большие данные, может привести к утечке памяти.