1.Provides

Providers 是 Nest 的一个基本概念。许多基本的 Nest 类可能被视为 provider - service, repository, factory, helper 等等。 他们都可以通过 constructor 注入依赖关系。 这意味着对象可以彼此创建各种关系,并且“连接”对象实例的功能在很大程度上可以委托给 Nest运行时系统。 Provider 只是一个用 @Injectable() 装饰器注释的类。简单点来说在开发中通常一个类调用另一个类,它们之间就会产生依赖关系,当类越来越多时这种依赖关系非常不好管理,而Nest正是基于IOC的思想将对象注入到IOC容器中,通过IOC容器来帮我们管理对象的之间的依赖关系,我们在需要使用时注入要使用的对象即可,Nest支持构造函数注入和字段注入两种注入方式。

  1. //app.service.ts
  2. import { Injectable } from '@nestjs/common';
  3. @Injectable() //将AppService注入到Nest IOC容器
  4. export class AppService {
  5. getHello(): string {
  6. return 'Hello World!';
  7. }
  8. }
  1. import { Controller, Get } from '@nestjs/common';
  2. import { AppService } from './app.service';
  3. @Controller()
  4. export class AppController {
  5. //通过构造方法注入依赖,此时你可以使用appService中的方法
  6. constructor(private readonly appService: AppService) {}
  7. @Get('/hello')
  8. getHello(): string {
  9. return this.appService.getHello();
  10. }
  11. }

1.1 Providers 作用域

1.2 可选的Providers

在一个类中注入Provides时,如果没有传递Provides则会导致错误,此时我们为注入的Providers提供一个默认值,可以通过@Optional()注解表示Provides是可选的。

  1. import { Injectable, Optional, Inject } from '@nestjs/common';
  2. @Injectable()
  3. export class HttpService<T> {
  4. constructor(
  5. //使用@Optional()装饰器表示 httpClient是可选的,@Inject()装饰器可以根据Providers关联的token注入对应的Providers
  6. @Optional() @Inject('HTTP_OPTIONS') private readonly httpClient: T
  7. ) {}
  8. }