在 NestJS 中,可以定义可注入对象的注入范围。(可能性是:单例,请求,瞬态)
在文档中,建议尽可能始终使用单例范围,因为 fe 请求范围将在每个请求-响应周期中嵌套实例化提供程序,这可能会影响应用程序的性能
使用请求范围的提供程序将对应用程序性能产生影响。尽管 Nest 尝试缓存尽可能多的元数据,但它仍然必须针对每个请求创建类的实例。因此,它会减慢您的平均响应时间和整体基准测试结果。除非提供者必须是请求范围的,否则强烈建议您使用默认的单例范围。
从什么时候开始对象实例化消耗这么多资源?整个框架是围绕单例实例构建的,从某种意义上说,我无法真正安全地使用“实例变量”,而不必担心 2 个请求/消费者可能使用相同的提供者实例,从而使这些实例成为“全状态”同时(由于节点的异步性质)并相互冲突的实例变量?
这是我想要做的:
export class MyClass {
constructor (...some dependencies) {
}
someMethod(payload){
this.myInstanceVariable = payload.data;
someMethod2();
}
someMethod2(){
// this.myInstanceVaraible usage, which i cant really trust it contains what i expect it to
}
}
Run Code Online (Sandbox Code Playgroud)
我来自红宝石背景。当我用 ruby 编写服务时,每个请求都会实例化它需要的任何服务,一旦请求完成,所有这些对象都会被自动垃圾收集。这样我就可以安全地在我的服务上定义实例变量——而不必担心“实例冲突”。
NestJS 支持注入范围。有提供者范围、控制器范围。
在您的情况下,如果您需要将实例变量与提供程序一起使用,您可能可以使用为REQUEST每个请求创建一个新对象实例的范围。
@Injectable({ scope: Scope.REQUEST })
export class CatsService {}
Run Code Online (Sandbox Code Playgroud)
您可以在https://docs.nestjs.com/fundamentals/injection-scopes上阅读更多相关内容