Skip to content

Время жизни

В InferDI есть три вида времени жизни:

ВидСозданиеКэшОчистка
singletonодин раз на контейнер-владелецконтейнер-владелецда
scopedодин раз на дочерний скоупдочерний скоупда
transientпри каждом получении сервисаникогданет

Получайте scoped-ключи из дочернего контейнера, который вернул createScope(). Стандартный проверяемый контракт запрещает разрешать их из корневого контейнера.

Правило жизненного цикла

Singleton не может напрямую зависеть от scoped или transient сервиса. Singleton создаётся один раз и используется всеми запросами, поэтому если он захватит scoped-значение - контекст текущего запроса, пользователя или транзакцию - состояние одного запроса незаметно протечёт во все остальные. InferDI отклоняет такую связь на уровне типов ещё до ревью кода.

ts
import { 
Container
} from '@inferdi/inferdi'
class
RequestContext
{
readonly
requestId
= 'req-1'
} class
UserService
{
constructor(readonly
request
:
RequestContext
) {}
} new
Container
()
.
registerClass
('request',
RequestContext
, [], 'scoped')
.
registerClass
('users',
UserService
, ['request'], 'singleton')

Такую регистрацию TypeScript отклонит при любом контракте времени выполнения. Стандартный проверяемый контракт также отклонит её во время выполнения, если приведение типа обойдёт систему типов.

Входные данные скоупа считаются scoped-зависимостями. Если сервис использует запрос, контекст авторизации, сведения о клиенте системы или данные задания, задайте ему время жизни scoped или transient. Вариант singleton компилятор отклонит ещё до запуска. Подробнее: Входные данные скоупа.

Проверки во время выполнения зависят от контракта контейнера. Точное поведение стандартного и fast-контрактов описано в разделе Опции контейнера.