Skip to content

Tiempos de vida

InferDI tiene tres tiempos de vida:

ClaseCreadoCacheado enLiberado por el contenedor
singletonuna vez por contenedor propietariocontenedor propietario
scopeduna vez por scope hijoscope hijo
transienten cada resoluciónnuncano

Resuelve las claves scoped desde un contenedor hijo devuelto por createScope(). El contrato predeterminado con comprobaciones rechaza su resolución desde el contenedor raíz.

La regla del tiempo de vida

Un singleton no puede depender directamente de un servicio scoped o transient. Un singleton se crea una vez y se comparte en cada petición, así que si captura un valor con scope — el contexto, el usuario o la transacción de la petición actual — el estado de esa única petición se filtra de forma silenciosa hacia todas las demás. InferDI hace que ese caso límite sea inexpresable en el sistema de tipos en lugar de dejarlo a la revisión de código.

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 rechaza ese registro con cualquier contrato de runtime. El contrato predeterminado con comprobaciones también rechaza la misma forma en runtime si un cast burla el sistema de tipos.

Las entradas de scope declaradas cuentan como dependencias scoped. Registra un consumidor de petición, contexto de autenticación, tenant o payload de trabajo como scoped o transient; el compilador rechaza un consumidor singleton antes del runtime. Consulta Entradas de scope.

El contrato del contenedor controla estas comprobaciones de runtime. Consulta Opciones del contenedor para conocer el comportamiento exacto de los contratos predeterminado y fast.