前言
Nest
中运用了依靠注入的方法,来办理各个模块之间的依靠联系。在Nest
中,供给了Provider
来注入服务。可是引进有多种方法,这里来记录下每种方法的运用场景和要求。
经过类来引进
在前面知道,provider
一般都是用@Injectable
装修的类
@Injectable()
export class AppService {
getWater(): string {
return 'hello water'
}
}
在模块的providers
中,经过类来引进,比方服务这种供给者。
import { Module } from '@nestjs/common'
import { AppController } from './app.controller'
import { AppService } from './app.service'
@Module({
imports: [],
controllers: [AppController],
providers: [AppService]
})
export class AppModule {}
其实上面的供给者是一种简写方法,完好的写法如下:
@Module({
imports:[],
controllers: [AppController],
providers: [{
provide: AppService,
useClass: AppService,
}],
})
经过 token 引进
经过 provide
指定注入的 token
,经过 useClass
指定注入的目标的类,Nest
会主动对它做实例化再注入
@Controller()
export class AppController {
constructor(private readonly appService: AppService) {}
@Get()
getWater(): string {
return this.appService.getWater()
}
}
这里是运用的结构函数注入,也能够经过属性注入。
@Controller()
export class AppController {
@Inject()
private readonly appService: AppService
@Get()
getWater(): string {
return this.appService.getWater()
}
}
经过@Inject
装修器来注入。指定注入的provider
的token
就行了,并且这个token
还能够是一个字符串。
@Module({
imports: [],
controllers: [AppController],
providers: [
{
provide: 'app_service',
useClass: AppService
}
]
})
export class AppModule {}
那么当token
是字符串的时候,那么导入的方法就变成下面这样了。
@Controller()
export class AppController {
constructor(@Inject('app_service') private readonly appService: AppService) {}
// 或许
// @Inject('app_service')
// private readonly appService: AppService;
@Get()
getWater(): string {
return this.appService.getWater()
}
}
指定一个值
除了指定一个类,还能够指定一个值,比方字符串,数字,布尔值等。
@Module({
imports: [],
controllers: [AppController],
providers: [
{
provide: 'water_token',
useValue: {
name: 'water',
age: 18
}
}
]
})
export class AppModule {}
@Controller()
export class AppController {
constructor(@Inject('water_token') private readonly waterToken: { name: string; age: number }) {}
}
也能够经过useFactory
来动态生成一个值。
@Module({
imports: [],
controllers: [AppController],
providers: [
{
provide: 'water_token',
useFactory: () => {
return {
name: 'water',
age: 18
}
}
}
]
})
export class AppModule {}
运用方法与上面一致。一起运用useFactory
还支持参数传递。
{
provide: 'water_token',
useFactory: (name: string) => {
return {
name: name,
age: 18,
}
},
inject: ['name']
}
provide
还能够经过useExisting
来指定别号,比方把name
这个provider
的别号指定为water_token
。
@Module({
imports: [],
controllers: [AppController],
providers: [
{
provide: 'water_token',
useExisting: 'name'
}
]
})
export class AppModule {}
总结
经过类来引进,经过token
来引进,经过useValue
来引进一个值,经过useFactory
来引进一个值,经过useExisting
来引进别号。
以上便是Nest
中Provider
的多种引进方法。