我们将介绍默认行为、请求作用域、注册 provider 时指定作用域选项、不同模块注册相同 provider 的情况、如何在多个模块间共享 provider 实例,以及全局模块的概念。
默认行为:单例作用域
在 NestJS 中,provider 默认是单例的。这意味着在整个应用程序中,provider 只会被实例化一次,所有请求共享相同的实例。这种行为可以提高性能,因为它减少了实例化的次数。然而,在某些情况下,我们可能需要为每个请求提供一个新的实例。
请求作用域
请求作用域允许我们为每个请求创建一个新的 provider 实例。这在需要根据请求上下文或用户信息定制服务的情况下非常有用。要将 provider 设置为请求作用域,我们需要在注册 provider 时指定作用域选项:
{
provide: MyService,
useClass: MyService,
scope: Scope.REQUEST,
}
注册 Provider 时指定作用域选项
在 NestJS 中注册 provider 时,我们可以通过指定作用域选项来更改其行为。作用域选项有以下几种:
Scope.DEFAULT:默认作用域,provider 是单例的。Scope.REQUEST:请求作用域,每个请求创建一个新的 provider 实例。Scope.TRANSIENT:瞬态作用域,每次注入创建一个新的 provider 实例。
不同模块注册相同的 Provider
当多个模块注册相同的 provider 时,NestJS 会为每个模块创建一个新的实例。这可能会导致意外的结果,因为我们可能期望在整个应用程序中共享相同的 provider 实例。
在多个模块间共享相同的 Provider 实例
为了在多个模块间共享相同的 provider 实例,我们可以将其注册到一个共享模块中,然后将共享模块导入到其他模块。这样,我们可以确保在整个应用程序中只有一个 provider 实例。
全局模块
全局模块是一种特殊的模块,它在整个应用程序中只被实例化一次。我们可以将模块标记为全局模块,以实现单例模式。要将模块标记为全局模块,我们需要使用 @Global() 装饰器:
import { Global, Module } from '@nestjs/common';
import { MyService } from './my.service';
@Global()
@Module({
providers: [MyService],
exports: [MyService],
})
export class SharedModule {}
这样,我们可以确保在整个应用程序中只有一个 SharedModule 实例,从而实现 provider 的单例模式。
NestJS 提供了灵活的 provider 作用域选项,可以根据需要创建单例、请求作用域或瞬态作用域的 provider。我们还可以通过共享模块和全局模块来在多个模块间共享相同的 provider 实例。这些功能使得 NestJS 成为一个强大且灵活的框架,可以满足各种应用程序需求。