Dépendance circulaire
Une dépendance circulaire se produit lorsque deux classes dépendent l’une de l’autre. Par exemple, la classe A a besoin de la classe B, et la classe B a également besoin de la classe A. Les dépendances circulaires peuvent survenir dans Nest entre les modules et entre les fournisseurs.
Bien que les dépendances circulaires doivent être évitées autant que possible, vous ne pouvez pas toujours le faire. Dans de tels cas, Nest permet de résoudre les dépendances circulaires entre les fournisseurs de deux manières. Dans ce chapitre, nous décrivons l’utilisation de forward referencing comme technique, et l’utilisation de la classe ModuleRef pour récupérer une instance de fournisseur à partir du conteneur DI comme une autre.
Nous décrivons également la résolution des dépendances circulaires entre les modules.
Référence directe
Une référence directe permet à Nest de référencer des classes qui ne sont pas encore définies à l’aide de la fonction utilitaire forwardRef()
. Par exemple, si CatsService
et CommonService
dépendent l’un de l’autre, les deux côtés de la relation peuvent utiliser @Inject()
et la fonction utilitaire forwardRef()
pour résoudre la dépendance circulaire. Sinon, Nest ne les instanciera pas parce que toutes les métadonnées essentielles ne seront pas disponibles. Voici un exemple :
@Injectable()export class CatsService { constructor( @Inject(forwardRef(() => CommonService)) private commonService: CommonService, ) {}}
@Injectable()export class CommonService { constructor( @Inject(forwardRef(() => CatsService)) private catsService: CatsService, ) {}}
Cela couvre un côté de la relation. Maintenant, faisons de même avec CommonService
:
Alternative de la classe ModuleRef
Une alternative à l’utilisation de forwardRef()
est de refactoriser votre code et d’utiliser la classe ModuleRef
pour récupérer un fournisseur d’un côté de la relation (autrement) circulaire. En savoir plus sur la classe utilitaire ModuleRef
ici.
Référence directe de module
Pour résoudre les dépendances circulaires entre les modules, utilisez la même fonction utilitaire forwardRef()
des deux côtés de l’association des modules. Par exemple :
@Module({ imports: [forwardRef(() => CatsModule)],})export class CommonModule {}
Cela couvre un côté de la relation. Maintenant, faisons de même avec CatsModule
:
@Module({ imports: [forwardRef(() => CommonModule)],})export class CatsModule {}