NestJS 自定义 Provider
侧边栏壁纸
  • 累计撰写 12 篇文章
  • 累计收到 1 条评论

NestJS 自定义 Provider

ASN__
2026-02-24 / 0 评论 / 7 阅读 / 正在检测是否收录...

一、依赖注入(DI)基础

依赖注入是控制反转(IoC) 技术,将依赖的实例化交给 Nest 运行时容器,而非手动代码创建。

IOC 容器就是 Nest 负责 “接管依赖实例化” 的核心,依赖注入(DI)是 IOC 思想在 Nest 里的具体实现方式。

工作三步流程

  1. 标记可注入

@Injectable() 装饰器 → 声明类可被 Nest IoC 容器管理。

  1. 声明依赖

控制器构造函数 constructor(private service: XxxService) → 声明依赖。

  1. 注册提供者

模块 @Moduleproviders 数组 → 绑定 Token 与实现类。

容器行为

  • 实例化时自动解析依赖,递归处理依赖链(自底向上)。
  • 默认单例:创建 → 缓存 → 复用。

二、标准 Provider(简写)

providers: [CatsService]

等价完整写法:

providers: [
  {
    provide: CatsService,
    useClass: CatsService,
  }
]
  • provideToken(注入令牌)
  • 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]

五、核心总结

  1. @Injectable() → 可被容器管理
  2. provide → 唯一 Token
  3. 五大实现:

    1. useValue:常量/对象
    2. useClass:动态类
    3. useFactory:动态工厂(支持依赖)
    4. useExisting:别名
    5. 类简写:providers: [Service]
  4. 跨模块使用必须 exports
1

评论

博主关闭了所有页面的评论