1. 什么是Providers
在Nestjs 凡被 @Injectable 装饰的类 都是Providers ,他们都可以通过 constructor 注入依赖关系。 这意味着对象可以彼此创建各种关系,并且“连接”对象实例的功能在很大程度上可以委托给 Nest运行时系统。 Provider 只是一个用 @Injectable() 装饰器注释的类。
2. providers的基本使用
第一种:(自定义名称)
完整写法
app.module.ts
@Module({
imports: [UserModule, User1Module],
controllers: [AppController, UserController],
providers: [
UserService,
{
provide: 'Abc',
useClass: AppService,
},
],
})
@Controller('get')
export class AppController {
constructor(@Inject('Abc') private readonly appService: AppService) {}
/** 相当于AppService 需要注入进来, 直接去调用上面的方法 */
@Get('hello')
getHello(): string {
return this.appService.getHello();
}
}
第二种:语法糖形式
是第一种用法的一个语法糖
app.module.ts
@Module({
imports: [UserModule, User1Module],
controllers: [AppController, UserController],
providers: [UserService, AppService],
})
app.controller.ts
@Controller('get')
export class AppController {
constructor(private readonly appService: AppService) {}
/** 相当于AppService 需要注入进来, 直接去调用上面的方法 */
@Get('hello')
getHello(): string {
return this.appService.getHello();
}
}
第三种:自定义注入值
app.module.ts
@Module({
imports: [UserModule, User1Module],
controllers: [AppController, UserController],
providers: [UserService,
{
provide: 'Value',
useValue: ['1', '2', '3'],
},
],
})
app.controller.ts
@Controller('get')
export class AppController {
constructor(@Inject('Value') private readonly value: string[]) {}
/** 相当于AppService 需要注入进来, 直接去调用上面的方法 */
@Get('hello')
getHello(): string[] {
return this.value;
}
}
第四种: 工厂模式
可以进行异步操作,引入其他模块进行操作
app.module.ts
@Module({
imports: [UserModule, User1Module],
controllers: [AppController, UserController],
providers: [UserService,
{
provide: 'Factory',
inject: [AppService2],
async useFactory(appService2: AppService2) {
return await new Promise((resolve) => {
setTimeout(() => {
resolve(appService2.getHello());
}, 2000);
});
},
},
],
})
app.controller.ts
@Controller('get')
export class AppController {
constructor( @Inject('Factory') private readonly factory: string) {}
/** 相当于AppService 需要注入进来, 直接去调用上面的方法 */
@Get('hello')
getHello(): string {
return this.factory;
}
}
app.service2.ts
import { Injectable } from '@nestjs/common';
@Injectable()
export class AppService2 {
getHello(): string {
return 'AppService2 - async first' + Math.random();
}
}