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;
}