Nest Provider

概述

许多基本 Nest 类都可以视为提供者(provider),像 services, repositories, factorieshelpers。它们都可以通过 constructor 注入依赖关系。这意味着对象间可以创建各种关系,并且 “连接” 对象实例的功能在很大程度上可以委托给 Nest 运行时系统。

控制器用于处理 HTTP 请求和委派更复杂的任务给提供者,提供者只是一个普通的类,用 @Injectable() 装饰器注释,在模块中声明为 providers

服务(Services)

@Injectable() 装饰器附带元数据,且声明这个类可以被 Nest IoC 容器管理。

依赖注入(Dependency injection)

Nest 是建立在强大的设计模式, 通常称为依赖注入。

依赖是服务或对象用于给类提供若干功能。依赖注入是一种设计模式用于类从外部资源获取而非自己创建依赖。(摘抄自 Angular 文档)

生命周期(Scopes)

Provider 通常具有与应用程序生命周期同步的生命周期(scope 作用域)。在启动应用程序时,必须解析每个依赖项,因此必须实例化每个 provider。同样,当应用程序关闭时,每个 provider 都将被销毁。但是,有一些方法可以改变 provider 生命周期的请求范围(request-scoped)。

自定义 providers

Nest 有一个内置的控制反转(”IoC”)容器,可以解决 providers 之间的关系。 此功能是上述依赖注入功能的基础。

可选的 providers

依赖有时可能不需要被解析,如类依赖一些配置对象,如果没有传递,则应使用默认的值。在这种场景下,依赖变成可选,应使用 @Optional() 装饰器。

@Injectable()
export class HttpService<T> {
  // 基于构造器注入的方式
  constructor(@Optional() @Inject('HTTP_OPTIONS') private httpClient: T) {}
}

基于属性的注入

以上使用均基于构造函数的注入,即通过 constructor 注入 providers。Nest 支持基于属性的注入。

@Injectable()
export class HttpService<T> {
  @Inject('HTTP_OPTIONS')
  private readonly httpClient: T;
}