- 创建项目
- Nest 控制器
- nest 配置路由请求数据
- Nest 服务
- Nest 模块
- 配置静态资源
- 配置模板引擎
- Cookie 的使用
- Session 的使用
- 跨域,前缀路径、网站安全、请求限速
- 管道、守卫、拦截器、过滤器、中间件
- 一例看懂中间件、守卫、管道、异常过滤器、拦截器
- 数据验证
- 配置抽离
- 环境配置
- 文件上传与下载
- 实现图片随机验证码
- 邮件服务
- nest 基于 possport + jwt 做登陆验证
- 对数据库的密码加密:md5 和 bcryptjs
- 角色权限
- 定时任务
- 接入 Swagger 接口文档
- nest 连接 Mongodb
- typeORM 操作 Mysql 数据库
- nest 统一处理数据库操作的查询结果
- 数据库实体设计与操作
- typeorm 增删改查操作
- typeorm 使用事务的 3 种方式
- typeorm 一对一关系设计与增删改查
- typeorm 一对多和多对一关系设计与增删改查
- typeorm 多对多关系设计与增删改查
- nest 连接 Redis
- 集成 redis 实现单点登录
- Q:nestJS 注入其他依赖时为什么还需要导入其 module
文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
Q:nestJS 注入其他依赖时为什么还需要导入其 module
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 {}
A
为啥”为什么还需要在 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 的特点。
最后,官网文档里其实有介绍 ,看 依赖注入
: https://docs.nestjs.com/modules
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论