예를 들어, Module-A에 있는 Service-A와 Module-B에 있는 Service-B가 서로 의존주입을 하려 하면 문제가 발생하여 실행되지 않습니다.
이를 해결하기 위한 간단한 방법은 "forwardRef" 입니다.
@Module({
imports: [ModuleBModule],
providers: [ModuleAService],
exports: [ModuleAService],
})
export class ModuleAModule {}
@Module({
imports: [ModuleAModule],
providers: [ModuleBService],
exports: [ModuleBService],
})
export class ModuleBModule {}
위와 같이 두 모듈이 서로를 import 하게 하면, "Nest cannot create the module instance" 에러 메시지를 남기며 어플리케이션이 실행되지 않습니다.
@Module({
imports: [forwardRef(() => ModuleBModule)],
providers: [ModuleAService],
exports: [ModuleAService],
})
export class ModuleAModule {}
@Module({
imports: [forwardRef(() => ModuleAModule)],
providers: [ModuleBService],
exports: [ModuleBService],
})
export class ModuleBModule {}
위와같이 변경하면 순환 참조 문제가 해결됩니다..
하지만, ModuleAService와 ModuleBService가 서로를 참조하면 여전히 문제가 발생합니다.
이를 해결하기 위해서는 ModuleAService와, ModuleBService에서도 forwardRef로 서로를 명시해야 합니다.
@Injectable()
export class ModuleAService {
constructor(
@Inject(forwardRef(() => ModuleBService))
private readonly moduleBService: ModuleBService) {
}
}
@Injectable()
export class ModuleBService {
constructor(
@Inject(forwardRef(() => ModuleAService))
private readonly moduleAService: ModuleAService) {
}
}
https://docs.nestjs.com/fundamentals/circular-dependency
// StrategyModule
@Module({
imports: [
forwardRef(() => TradingModule)
],
controllers: [StrategyMutationController, StrategyQueryController],
providers: [StrategyService, StrategyHashService, StrategyResolver],
exports: [StrategyService],
})
export class StrategyModule {}
// TradingModule
@Module({
imports: [
forwardRef(() => StrategyModule)
],
controllers: [TradingQueryController, TradingMutationController],
providers: [TradingService, TradingResolver],
exports: [TradingService],
})
export class TradingModule {}
//StrategyService
@Injectable()
export class StrategyService {
constructor(
@Inject(forwardRef(() => TradingService))
private readonly tradingService: TradingService,
) {}
}
// TradingService
@Injectable()
export class TradingService {
constructor(
@Inject(forwardRef(() => StrategyService))
private readonly strategyService: StrategyService,
) {}
}