一、依赖注入(DI)基础
依赖注入是控制反转(IoC) 技术,将依赖的实例化交给 Nest 运行时容器,而非手动代码创建。
IOC 容器就是 Nest 负责 “接管依赖实例化” 的核心,依赖注入(DI)是 IOC 思想在 Nest 里的具体实现方式。
工作三步流程
- 标记可注入
@Injectable() 装饰器 → 声明类可被 Nest IoC 容器管理。
- 声明依赖
控制器构造函数 constructor(private service: XxxService) → 声明依赖。
- 注册提供者
模块 @Module 的 providers 数组 → 绑定 Token 与实现类。
容器行为
- 实例化时自动解析依赖,递归处理依赖链(自底向上)。
- 默认单例:创建 → 缓存 → 复用。
二、标准 Provider(简写)
providers: [CatsService]等价完整写法:
providers: [
{
provide: CatsService,
useClass: CatsService,
}
]provide:Token(注入令牌)useClass:实际实例化的类
三、自定义 Provider 五种用法
1. 值提供者:useValue
- 注入常量、外部库、模拟对象。
- 适合测试替换真实服务。
{
provide: CatsService,
useValue: mockCatsService
}2. 非类 Token(字符串 / Symbol / 枚举)
- 用字符串做令牌,配合
@Inject()使用。
{ provide: 'CONNECTION', useValue: connection }注入:
constructor(@Inject('CONNECTION') connection: Connection) {}3. 类提供者:useClass
- 动态切换实现类(如开发/生产环境)。
{
provide: ConfigService,
useClass: process.env.NODE_ENV === 'development'
? DevelopmentConfigService
: ProductionConfigService
}4. 工厂提供者:useFactory(最灵活)
- 动态创建实例,可注入其他依赖。
inject数组 → 按顺序传入工厂函数参数。
{
provide: 'CONNECTION',
useFactory: (optionsProvider: MyOptionsProvider) => {
return new DatabaseConnection(optionsProvider.get());
},
inject: [MyOptionsProvider]
}支持可选依赖:
inject: [{ token: 'OptionalProvider', optional: true }]5. 别名提供者:useExisting
- 给已有 Provider 起别名,指向同一个单例。
{
provide: 'AliasedLogger',
useExisting: LoggerService
}四、导出自定义 Provider
Provider 默认模块内可见,跨模块需导出:
// 按 Token 导出
exports: ['CONNECTION']
// 或完整对象导出
exports: [connectionFactory]五、核心总结
@Injectable()→ 可被容器管理provide→ 唯一 Token五大实现:
useValue:常量/对象useClass:动态类useFactory:动态工厂(支持依赖)useExisting:别名- 类简写:
providers: [Service]
- 跨模块使用必须
exports
评论