Cómo solucionar una referencia circular entre módulos

32/33

Lectura

NestJS Realmente es un framework potente que nos permite tener una arquitectura sólida y escalable. Pero al conectarnos con bases de datos podemos llegar a enfrentarnos a una referencia circular, problema que debemos evitar y/o aprender a solucionar.

En nuestro proyecto tenemos a UsersModule que importa a ProductsModule con el fin usar al ProductsService. Pero ¿qué pasa si _ProductsModule_ necesita hacer una consulta hacia users? Recuerda que dentro de UsersModule está el UserService y la entidad de Users. Si importamos a UserModule dentro de ProductsModule, tendríamos un problema de referencia circular entre módulos.

Existen dos maneras de solucionarlo si llegas a tener este caso.

Solución 1: entidades en un Global Module

Una de las soluciones es poner todas las entidades de tu proyecto en el DatabaseModule de manera global haciendo que cada uno de los demás módulos pueda usar estas entidades sin tener problemas de referencia circular.

De esta manera cada módulo puede usar el Repository Pattern y hacer la consulta que necesite de una entidad, puedes ver un ejemplo de esta solución en la rama 21 y detalle de cambios 😎

Solución 2:  Referencia directa

Una de las formas que tiene NestJS para resolver la referencia circular es tener una referencia directa por ejemplo, si AService y BService dependen el uno del otro, ambos lados de la relación pueden usar @Inject () y la utilidad forwardRef () para resolver la dependencia circular, ejemplo:

@Injectable()
export class AService {
  constructor(
    @Inject(forwardRef(() => BService ))
    private service: BService ,
  ) {}
}

De la misma manera en el otro servicio.

@Injectable()
export class BService {
  constructor(
    @Inject(forwardRef(() => AService ))
    private service: AService ,
  ) {}
}

También puedes aplicar lo mismo entre módulos

@Module({
  imports: [forwardRef(() => AModule)],
})
export class BModule{}
@Module({
  imports: [forwardRef(() => BModule)],
})
export class AModule{}

¿Te has enfrentado a un problema de referencia circular? Compártenos en los comentarios de qué manera lo resolviste.

Aportes 1

Preguntas 1

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad? Crea una cuenta o inicia sesión.

Uff, me gusto mas este post que el de la propia doc 👏