nest 系列 - provider

47 阅读1分钟

Providers

如果 使用 nest 的开发者,一定对 provider 不陌生,我们对 provider 的用法 做一个总结

基础使用

使用装饰器 Injectable 对一个类进行装饰,此时这个被装饰的类就变为 provider

cat.service.ts

@Injectable()
export class CatsService {
  constructor() {}
   create() {
    console.log("aaaaa")
    return "aaa"
  }
}

在 module 中引入

cat.module.ts

import { CatsController } from "./cat.controller";
import { CatsService } from "./cat.service2";

@Module({
    controllers: [CatsController],
    providers:[CatsService]
})

在 controller 直接使用

cat.controller.ts

@Controller()
export class CatsController {
    constructor( private readonly catsService: CatsService ){}
    
    @Post("create")
    create() {
     return this.catsService.create()
   }
}

自定义名称 useClass

cat.controller.ts

import { CatsController } from "./cat.controller";
import { CatsService } from "./cat.service2";

@Module({
    controllers: [CatsController],
    providers:[{
      provide: "cat",
      useClass: CatsService,
    }]
})

这种相当于 上文 中的直接引入的语法糖,添加了自定义名称以后就不能直接在 controller 使用了,需要使用 inject 指定名称

cat.controller.ts

import { Body, Controller, Get, Inject, Post } from "@nestjs/common";
export class CatsController {
    constructor(@Inject("cat") private readonly catsService: CatsService ){}
    
   @Post("create")
   create() {
    return this.catsService.create()
  }
}

自定义注入值

使用 useValue 提供值

cat.module.ts

@Module({
 controllers: [CatsController],
 providers:[
    {
      provide: "shopList",
      useValue: ["TB", "PDD", "JD"],
    }, 
 ]
})

使用 inject 引入

cat.controller.ts

export class CatsController {
     @Inject("shopList") private readonly shopList: string[]
}

  @Post("create")
  async create() {
    console.log(this.shopList)
  }

工厂函数

有时我们在一个 service 中需要使用 另一个 service 的方法,使用 下面的这种方式进行引入

cat.module.ts

@Module({
 controllers: [CatsController],
 providers:[
  CatsService2,
  {
    provide: "Test",
    inject: [CatsService2],
    useFactory(catsService2: CatsService2) {
        return new CatsService(catsService2);
    }
  },
 ]
})

在 CatsService 同样使用 inject 进行接收

cat.service.ts

@Injectable()
export class CatsService {
  constructor(@Inject("Test") private readonly catsService2: CatsService2) {}
  
  create(): any {
    this.catsService2.create();
    return 123;
  }