nestjs注入💉范围

1,269 阅读1分钟

实例共享是 nestjs 模块的特点,单例实例对于我们的应用程序是完全安全的。注入范围提供了一种获取所需提供者生存期行为的机制

注入范围

单例模式:SINGLETON

- 提供程序的单个实例在整个应用程序中共享。
- 实例生存期与应用程序生命周期直接相关。
- 应用程序启动后,所有单例提供程序都将实例化。
- 默认情况下使用Singleton范围。

基于请求:REQUEST

- 将为每个传入请求专门创建提供者的新实例。
- 请求完成处理后,将垃圾回收该实例。
import { Injectable, Scope } from '@nestjs/common';

@Injectable({ scope: Scope.REQUEST })
export class CatsService {}

暂时的:TRANSIENT

- 瞬态提供程序不跨消费者共享
- 每个注入临时提供程序的使用者都将收到一个新的专用实例。

控制器作用域

  • 对于请求范围的控制器,将为每个入站请求创建一个新实例,并在请求完成处理后进行垃圾回收。
@Controller({
  path: 'cats',
  scope: Scope.REQUEST,
})
export class CatsController {}

服务

// restful
import { Injectable, Scope, Inject } from '@nestjs/common';
import { REQUEST } from '@nestjs/core';
import { Request } from 'express';

@Injectable({ scope: Scope.REQUEST })
export class CatsService {
  constructor(@Inject(REQUEST) private request: Request) {}
}

// graphql
import { Injectable, Scope, Inject } from '@nestjs/common';
import { CONTEXT } from '@nestjs/graphql';

@Injectable({ scope: Scope.REQUEST })
export class CatsService {
  constructor(@Inject(CONTEXT) private context) {}
}

性能

使用请求范围的提供程序将对应用程序性能产生影响。虽然Nest尝试缓存尽可能多的元数据,但仍然必须在每个请求上创建您的类的实例。因此,这会减慢您的平均响应时间和总体基准测试结果。除非提供程序必须是请求范围的,否则强烈建议您使用默认的单例作用域。