javascript - 由于另一个服务注入,服务找不到依赖项
问题描述
我有一个 NestJs 应用程序,在我对另外两个服务(PmsConnectionService -> UserService)使用依赖注入后,以前工作的服务会引发错误(ReviewService 找不到 DoctorLoaderService)。所有这些都来自不同的模块。
我的nestjs 版本是5.1.0。PmsConnectionService 是我新创建的模块的一部分。我不得不使用 forwardRef 连接到持有 DoctorLoaderService 的模块。请注意,在下面的代码中,PmsConnectionService 注入了 DoctorClinicService,它正在注入 DoctorLoaderService。当我在 PmsConnectionService 中注释掉 DoctorClinicService 时,错误消失了。但是我仍然不知道为什么首先会发生错误。
服务
@Injectable()
export class PmsConnectionService {
constructor(
private clinicService: DoctorClinicService,
) {}
@Injectable()
export class UserService {
constructor(
private readonly connectionService: PmsConnectionService,
) { }
@Injectable()
export class DoctorLoaderService {
constructor(
@Inject(forwardRef(() => ReviewService))
private readonly reviewService: ReviewService,
) {}
@Injectable()
export class ReviewService {
constructor(
private readonly doctorLoader: DoctorLoaderService,
private readonly reviewManager: ReviewManagerService,
) { }
模块:
@Module({
imports: [
forwardRef(() => DoctorModule),
TypeOrmModule.forFeature([
...
]),
],
providers: [
PmsConnectionService,
],
exports: [
PmsConnectionService,
],
})
export class PmsModule {}
@Module({
imports: [
PmsModule,
TypeOrmModule.forFeature([
User,
...
]),
],
controllers: [
UserController,
],
providers: [
UserService,
],
exports: [UserService],
})
export class UserModule {
public configure(consumer: MiddlewareConsumer) {
consumer
.apply(ActivityMiddleware)
.exclude({
path: '*',
method: RequestMethod.OPTIONS,
})
.forRoutes({ path: '*', method: RequestMethod.ALL });
}
}
@Module({
imports: [
UserModule,
TypeOrmModule.forFeature([
User,
DoctorProfile,
DoctorClinic,
...
]),
forwardRef(() => BookingModule),
],
controllers: [
DoctorProfileController,
],
providers: [
DoctorLoaderService,
DoctorClinicService,
],
exports: [
DoctorClinicService,
DoctorLoaderService,
],
})
export class DoctorModule { }
Module({
imports: [
PmsModule,
UserModule,
DoctorModule,
TypeOrmModule.forFeature([
...
]),
],
controllers: [
...
],
providers: [
ReviewService,
],
exports: [
ReviewService,
],
})
export class BookingModule { }
在启动应用程序时会引发以下错误:
[Nest] 17921 - 9/26/2019, 9:44:15 PM [NestFactory] Starting Nest application...
[Nest] 17921 - 9/26/2019, 9:44:15 PM [ExceptionHandler] Nest can't resolve dependencies of the ReviewService (?, ReviewManagerService, NotiIssuerService). Please make sure that the argument at index [0] is available in the current context. +90ms
Error: Nest can't resolve dependencies of the ReviewService (?, ReviewManagerService, NotiIssuerService). Please make sure that the argument at index [0] is available in the current context.
at Injector.resolveSingleParam (/Users/dude/Documents/lekar/unexpected_koala_backend/node_modules/@nestjs/core/injector/injector.js:115:19)
at Promise.all.dependencies.map (/Users/dude/Documents/lekar/unexpected_koala_backend/node_modules/@nestjs/core/injector/injector.js:85:49)
at Array.map (<anonymous>)
at Injector.resolveConstructorParams (/Users/dude/Documents/lekar/unexpected_koala_backend/node_modules/@nestjs/core/injector/injector.js:83:58)
at Injector.loadInstance (/Users/dude/Documents/lekar/unexpected_koala_backend/node_modules/@nestjs/core/injector/injector.js:63:20)
at Injector.loadInstanceOfComponent (/Users/dude/Documents/lekar/unexpected_koala_backend/node_modules/@nestjs/core/injector/injector.js:40:20)
at Promise.all.map (/Users/dude/Documents/lekar/unexpected_koala_backend/node_modules/@nestjs/core/injector/instance-loader.js:39:102)
at Array.map (<anonymous>)
at InstanceLoader.createInstancesOfComponents (/Users/dude/Documents/lekar/unexpected_koala_backend/node_modules/@nestjs/core/injector/instance-loader.js:39:59)
at Promise.all.map (/Users/dude/Documents/lekar/unexpected_koala_backend/node_modules/@nestjs/core/injector/instance-loader.js:26:24)
尽管我认为问题出在 PmsConnectionService 和 DoctorClinicService 之间的连接上,但我不知道如何解决这个问题。
解决方案
看起来你只设置了一半的前向裁判。由于您的ReviewService
(部分BookingModule
)依赖于您的DoctorLoaderService
(部分DoctorModule
)并且您的DoctorLoaderService
依赖于您的ReviewService
,因此您需要forwardRef
在每个受影响类的模块和服务中。在这种情况下,DocotrModule
需要 aforwardRef(() => BookingModule)
和BookingModule
需要 aforwardRef(() => DoctorModule)
以及具有类似设置。ReviewService
DoctorLoadingService
@Inject(forwardRef(() => )
一般来说,最好避免这些循环依赖,因为它们会造成难以调试的麻烦。也许看看您是否可以采取架构更改以使代码更简单/更少依赖其他部分。
推荐阅读
- php - PHP.ini 思考设置与声明 strict_types 冲突
- r - 是否可以使用 actionButton 清除 ShinyApp 中显示的输出
- html - 修复独立于目录的 URL
- ruby-on-rails - Rails 6 所有 validate_presence_of 测试均失败
- python - 如何使用 Python 获取实时公共交通时间?
- java - 如何表示一个空的/无效的 java.nio.Path
- database - 如何在 mongoDB 中查找数组
- java - 将值从一个非静态方法传递到另一个从main?
- java - “应用程序启动方法 java.lang.reflect.InvocationTargetException 中的异常”
- c++ - 如何在其中初始化类的数组实例?