Dependências circulares ocorrem quando dois services dependem um do outro. O nestelia fornece forwardRef() para tratar esses casos.
O Problema
typescript
// Isso cria uma dependência circular:
@Injectable()
class ServiceA {
constructor(@Inject(ServiceB) private b: ServiceB) {}
}
@Injectable()
class ServiceB {
constructor(@Inject(ServiceA) private a: ServiceA) {}
}No momento da resolução, ServiceA precisa de ServiceB que precisa de ServiceA — um deadlock.
A Solução
Use forwardRef() em pelo menos um lado da referência circular:
typescript
import { Injectable, Inject, forwardRef } from "nestelia";
@Injectable()
class ServiceA {
constructor(
@Inject(forwardRef(() => ServiceB)) private b: ServiceB
) {}
}
@Injectable()
class ServiceB {
constructor(@Inject(ServiceA) private a: ServiceA) {}
}forwardRef(() => ServiceB) adia a resolução de ServiceB até que todos os providers tenham sido registrados, quebrando a cadeia circular.
Quando Usar forwardRef
- Dois services que fazem referência um ao outro
- Um service que referencia um controller e vice-versa
- Imports circulares entre módulos
Boas Práticas
Dependências circulares frequentemente indicam um problema de design. Antes de recorrer a forwardRef(), considere:
- Extrair lógica compartilhada em um terceiro service do qual ambos dependam
- Usar eventos — um service publica, o outro subscreve
- Reestruturar módulos — mover providers compartilhados para um módulo comum
Use forwardRef() apenas quando a refatoração não for prática.