nestJS注入其他依赖时为什么还需要导入其module?

刚开始学习nestJS,有一个疑问--

在NestJS中,

A模块的Service需要调用B模块的service中一个方法,则需要在A的Service导入B的service
场景如下:

// A.Service
import { BService } from '../B/B.service';

@Injectable()
export class A {
  constructor(
    private readonly _BService: BService,
  ) {}
}

我的理解是:

  • 在此处@Injectable装饰器已经将B的Service类实例化了,
  • 已经可以使用B的类方法了。

但为什么还需要在A的module.ts中导入B模块呢?
像是这样:

// A.module.ts
import { BModule } from '../B/B.module';

@Module({
  imports: [BModule],
  controllers: [AController],
  providers: [AService],
  exports: [AService],
})
export class AModule {}
阅读 4.2k
2 个回答

首先说,为啥"为什么还需要在A的module.ts中导入B模块呢"?

因为 BService的作用域只在 BModule里,所以你要在 AController里直接用,就会报错拿不到实例。

再来说,"有什么办法可以让 BService随处直接用么?",参考如下手段:

B 的module 声明时,加上@Global,如下:

import { Module, Global } from '@nestjs/common';
import { BService } from './B.service';

@Global()
@Module({
  providers: [BService],
  exports: [BService],
})
export class BModule {}

这样,你就不用在 AModule的声明里引入 BModule了。

关于『你的理解』部分,貌似你把@Inject@Injectable 搞混了,建议再读一读这个部分的文档,多做些练习/尝试,自己感受下每个api的特点。

最后,官网文档里其实有介绍 ,看依赖注入

Injectable 表示自己可以被注入到其他模块里,不是注入其他模块。

从名字你也应该能看出来,它是个形容词:可注入的,修饰的是自己。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题