Inyección perezosa
Lazy<T> es un pequeño wrapper de resolución diferida. Resulta útil cuando hace falta retrasar el orden de construcción, o cuando dos servicios singleton necesitan referenciarse entre sí sin resolver ambos en los constructores.
import { Container, type Lazy } from '@inferdi/inferdi'
class Clock {
now() {
return Date.now()
}
}
class Audit {
constructor(private readonly clock: Lazy<Clock>) {}
record(event: string) {
console.log(event, this.clock.get().now())
}
}
const c = new Container()
.registerClass('clock', Clock, [], 'singleton', 'clockLazy')
.registerClass('audit', Audit, ['clockLazy'], 'singleton')Pasar un lazyKey crea un registro acompañante cuyo valor es { get: () => target }.
El tiempo de vida se preserva
Lazy no es una vía de escape para el tiempo de vida. Un singleton solo puede inyectar un acompañante Lazy de un destino singleton.
new Container()
.registerClass('request', RequestContext, [], 'scoped', 'requestLazy')
// Rejected: Lazy<scoped> is not safe for singleton consumers.
.registerClass('app', AppService, ['requestLazy'], 'singleton')Los consumidores con scope y transitorios pueden usar acompañantes perezosos para cualquier tiempo de vida porque no se cachean globalmente.
Dependencias circulares
InferDI detecta los ciclos; no los rompe automáticamente. Para dos servicios singleton, pon Lazy<singleton> en un lado y mantén el otro directo. Para ciclos de factorías asíncronas, la solución recomendada es arquitectónica: divide la inicialización compartida, eleva uno de los lados o evita el ciclo.
