请求范围服务

问题描述 投票:3回答:3

根据我的理解,现在nestjs在应用程序启动时创建了所有服务,也许我使用它是错误的是有没有办法配置NestJs根据请求创建服务?就像每次请求完成一样,会重新创建一些在该请求上使用的服务?

javascript node.js typescript nestjs
3个回答
2
投票

随着nest.js 6.0的发布,添加了injection scopes。有了这个,您可以为您的提供商选择以下三个范围之一:

  • SINGLETON:默认行为。您的提供程序的一个实例用于整个应用程序
  • TRANSIENT:为每个注入它的提供者创建一个专用的提供者实例。
  • 请求:对于每个请求,都会创建一个新的提供者。警告:此行为将在您的依赖关系链中冒出来。示例:如果UsersController(Singleton)注入注入OtherService(Request)的UsersService(Singleton),则UsersController和UsersService将自动成为请求范围。

Usage

将它添加到@Injectable()装饰器:

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

或者在模块定义中为自定义提供程序设置它:

{
  provide: 'CACHE_MANAGER',
  useClass: CacheManager,
  scope: Scope.TRANSIENT,
}

1
投票

1月19日更新

这将在nest.js 6.0中实现,请参阅此pull request


正如卡米尔在这个issue写道:

一旦async-hooks功能(它在节点10中仍然是实验性的)是稳定的,我们将考虑为请求范围的实例提供内置解决方案。

所以现在,这似乎还不可能。您只能将整个模块标记为SingleScope与默认的单例行为。使用SingleScope,将为每个导入创建一个新的模块实例。


0
投票

我想使用di能够将整个端点标记为在事务中运行,而无需为端点编写某些特定代码。而不是使用di有一个软件包可以帮助我们基于一个名为cls-hooked的回调链创建资源,该回调链基于Kim Kern在他的响应中写的内容,async-hooks使用这个我能够在调用一个enpoint时启动一个事务并停止一旦完成了这一点,因为我使用typeorm作为db orm我能够使用this solution

© www.soinside.com 2019 - 2024. All rights reserved.