当前位置: 首页 > news >正文

【NestJS】依赖注入(DI) 的模块系统、`imports`、`@Module`、`providers` 之间的关系彻底搞清楚

1️⃣ @Module() 的作用

在 NestJS 中,模块 (Module) 是组织代码的基本单位。它有四大核心属性:

属性作用
providers定义当前模块提供的服务(可以被注入的类、值、工厂等)
controllers定义当前模块的控制器(接收请求、调用服务)
imports导入其他模块,使得它们导出的 providers 可被当前模块使用
exports将当前模块中的 providers 暴露给被导入模块使用

简单理解:

  • 模块 = 容器,负责收集 provider、控制器、导入的依赖。
  • 每个模块内部的 provider 默认只能在模块内部使用,除非用 exports 暴露。
  • 模块之间通过 importsexports 建立依赖关系。

2️⃣ providers 的作用

providers 就是 模块可注入对象的清单

支持的类型:

  1. (最常用):
@Injectable()
export class UserService {}

在模块中注册:

@Module({providers: [UserService],
})
export class UserModule {}
  1. (useValue):
@Module({providers: [{ provide: 'API_KEY', useValue: '123456' },],
})
  1. 工厂函数(useFactory):
@Module({providers: [{provide: DatabaseService,useFactory: () => new DatabaseService(process.env.DB_URL),},],
})
  1. 替代实现(useClass):
@Module({providers: [{ provide: Logger, useClass: FileLogger },],
})

所有 provider 最终都会注册到模块的 IoC 容器 中,供构造函数注入使用。


3️⃣ imports 的作用

imports模块间依赖的桥梁

  • 当一个模块需要使用其他模块的 provider 时,就要通过 imports 导入那个模块。
  • 被导入模块必须通过 exports 将需要共享的 provider 暴露。

示例:

// database.module.ts
@Module({providers: [DatabaseService],exports: [DatabaseService], // 暴露给其他模块
})
export class DatabaseModule {}// user.module.ts
@Module({imports: [DatabaseModule], // 导入 DatabaseModuleproviders: [UserService], // UserService 依赖 DatabaseService
})
export class UserModule {}

Nest 启动时,容器会:

  1. 加载 UserModule
  2. 发现它导入了 DatabaseModule
  3. DatabaseModule.exports 中注册 DatabaseService
  4. UserService 的构造函数依赖 DatabaseService,容器自动注入。

总结:imports + exports = 模块间依赖共享机制


4️⃣ provider 和模块的关联

关系可理解为:

@Module({imports: [...],     // 导入模块,获取它们 exports 的 providersproviders: [...],   // 当前模块自己的 providerscontrollers: [...], // 当前模块控制器exports: [...]      // 将当前模块的 providers 暴露给其他模块
})

依赖注入流程:

  1. 容器扫描模块的 providers → 注册到模块容器。
  2. 容器扫描模块的 imports → 取到导入模块的 exports → 合并到当前模块容器。
  3. 当控制器或 provider 需要依赖时,容器从模块容器中查找 provider 实例。

5️⃣ 总结

  • @Module() = 容器 + 组织模块结构
  • providers = 当前模块提供的可注入服务
  • imports = 导入其他模块的导出 providers
  • exports = 暴露当前模块的 providers 给其他模块
  • DI 的魔力就在于:模块之间解耦,provider 生命周期由容器统一管理,控制器只关注业务逻辑

http://www.dtcms.com/a/525666.html

相关文章:

  • Vibe Coding 小白上手指南
  • 洞察:当前Crypto大环境正需要Solana这种工程化实用主义
  • 做空机构的网站拌合站建站方案
  • wordpress搭建教育网站三只松鼠网络营销案例分析
  • FongMi 蜂蜜影视播放器TVBOX衍生版 V4.6.2支持安卓手机和电视附100+配置地址接口
  • 免费自助建站哪个好上海短视频制作
  • 北京好用的h5建站一般建站公司用什么cms
  • Xshell连接kali系统
  • 做网站 图片 文件夹 放哪儿网页升级访问紧急通通知
  • 赋能智慧水利:视频汇聚平台EasyCVR智慧水利工程视频管理系统解决方案
  • CentOS7.9部署Mysql8(二进制方式)
  • 太原网站建设推广驻马店哪家做网站好
  • 音乐网站设计源码网页制作知识点归纳
  • Linux POSIX信号量与线程池
  • 微网站和普通网站区别重庆建设科技培训中心官方网站
  • 网站做受网站做计算机网站有哪些功能
  • 网站有没有做301搬瓦工vps建设网站
  • GPIO重点
  • 邢台提供网站建设公司电话wordpress阅读更多
  • 网站由哪些部分组成部分组成部分惠阳做网站
  • CICD(一)CI/CD概述及GitLab部署和一些Git命令
  • 网站编辑器图书馆网站建设汇报
  • Guacamole实现远程桌面+实时语音(VNC)
  • SpringBoot知识点总结
  • 怎么建立一个网站能够与讯飞云对话wordpress 示例页面 删除
  • “package.xml”和“CMakeLists.txt”配置
  • 电子元器件网站建设网站案例代码
  • 照片后期网站博客网站做啥好
  • Docker监控系统中添加NodeExporter
  • 2025,数字化转型浪潮中的技术新航标