前言

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装修器来注入。指定注入的providertoken就行了,并且这个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来引进别号。

以上便是NestProvider的多种引进方法。