在NestJS中可以以多种方式自定义Providers。以下是一些常见的方法:
1. 值提供者(Value Providers)
值提供者用于提供一些硬编码的值,例如配置对象或常量。这类提供者通过 useValue
关键字来指定要注入的值。
使用过程:
- 在你的模块中定义一个值提供者。
- 使用
provide
属性来指定令牌(通常是一个字符串或符号)。 - 使用
useValue
属性来提供一个硬编码的值。
示例:
import { Module } from '@nestjs/common';@Module({providers: [{provide: 'API_KEY',useValue: '12345-ABCDE',},],
})
export class AppModule {}
2. 类提供者(Class Providers)
类提供者用于将类实例作为依赖注入。这是最常见的提供者类型,通常用于服务类。
使用过程:
- 创建一个服务类。
- 在模块的
providers
数组中使用该类。 - 使用
provide
关键字指定一个令牌,并使用useClass
来指定类。
示例:
import { Module } from '@nestjs/common';class MyService {// 服务逻辑
}@Module({providers: [{provide: 'MyService',useClass: MyService,},],
})
export class AppModule {}
3. 工厂提供者(Factory Providers)
工厂提供者通过工厂函数来创建提供者实例。这种方式适用于需要动态创建依赖项的场景。
使用过程:
- 定义一个工厂函数,该函数返回提供者的实例。
- 在模块的
providers
数组中使用这个工厂函数。 - 使用
provide
关键字指定一个令牌,并使用useFactory
来指定工厂函数。
示例:
import { Module } from '@nestjs/common';@Module({providers: [{provide: 'ASYNC_CONNECTION',useFactory: async () => {const connection = await createConnection();return connection;},},],
})
export class AppModule {}
4. 异步提供者(Async Providers)
异步提供者是工厂提供者的一个变种,允许在提供者实例化之前执行一些异步操作。
使用过程:
- 创建一个异步的工厂函数。
- 在模块的
providers
数组中使用这个异步函数。 - 使用
provide
关键字指定一个令牌,并使用useFactory
来指定异步工厂函数。
示例:
import { Module } from '@nestjs/common';@Module({providers: [{provide: 'ASYNC_CONNECTION',useFactory: async () => {const connection = await createConnection();return connection;},},],
})
export class AppModule {}
5. 别名提供者(Alias Providers)
别名提供者用于为已存在的提供者创建一个别名。
使用过程:
- 定义一个服务或提供者。
- 创建一个别名提供者,并使用
useExisting
指向现有的服务或提供者。
示例:
import { Module } from '@nestjs/common';class ActualService {// 实际服务的逻辑
}@Module({providers: [ActualService,{provide: 'AliasService',useExisting: ActualService,},],
})
export class AppModule {}
6. 多提供者(Multi Providers)
多提供者用于在一个令牌下注册多个提供者,通常用于创建插件系统或聚合相同类型的服务。
使用过程:
- 在模块的
providers
数组中定义多个提供者。 - 所有这些提供者使用相同的令牌,并将
multi
属性设置
为 true
。
示例:
import { Module } from '@nestjs/common';class MyService {// 服务逻辑
}class AnotherService {// 另一个服务的逻辑
}@Module({providers: [{provide: 'MY_SERVICE',useClass: MyService,multi: true},{provide: 'MY_SERVICE',useClass: AnotherService,multi: true},],
})
export class AppModule {}
以上是 NestJS 中六种自定义提供者的具体使用过程。这些提供者可以灵活地应用于各种场景,满足不同的开发需求。