NestJS之05- Providers

429 阅读1分钟

1. 什么是Providers

在Nestjs 凡被 @Injectable 装饰的类 都是Providers ,他们都可以通过 constructor 注入依赖关系。 这意味着对象可以彼此创建各种关系,并且“连接”对象实例的功能在很大程度上可以委托给 Nest运行时系统。 Provider 只是一个用 @Injectable() 装饰器注释的类。

image.png

image.png

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

image.png

第四种: 工厂模式

可以进行异步操作,引入其他模块进行操作

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

image.png