Typescript 在inversifyjs中重置作用域容器

Typescript 在inversifyjs中重置作用域容器,typescript,memory-leaks,garbage-collection,reference-counting,inversifyjs,Typescript,Memory Leaks,Garbage Collection,Reference Counting,Inversifyjs,我正在实现一个作用域容器体系结构,以便为每个Express请求(或apollographql请求)创建一个新的容器。我有一个生命周期方法,可以在发送响应后调用,这有助于清理和释放内存,并且该方法可以引用我们完成服务的请求的上下文。在该上下文中我有一个对我先前创建的inversifyjs容器的引用,因此我可以在清理方法中引用该容器,我如何删除该容器 function ScopedContainer(userId: number) { const container = new Containe

我正在实现一个作用域容器体系结构,以便为每个Express请求(或apollographql请求)创建一个新的
容器。我有一个生命周期方法,可以在发送响应后调用,这有助于清理和释放内存,并且该方法可以引用我们完成服务的请求的上下文。在该
上下文中
我有一个对我先前创建的
inversifyjs容器
的引用,因此我可以在清理方法中引用该
容器
,我如何
删除该容器

function ScopedContainer(userId: number) {
  const container = new Container();
  container.bind<number>(TYPES.userId).toConstantValue(userId);
  //rest of bindings container.bind ...
  return container;
}

async({req, res}) => {
  const { headers } = req;
  const { userId } = headers;
  const container = ScopedContainer(clientId);
  const context = { container }
  ///...
}

willSendResponse(({container}) => {
  // how to instruct inversifyjs to ditch all references to container?
  // something like container.destroy?
});


函数作用域容器(userId:number){
const container=新容器();
container.bind(TYPES.userId).toConstantValue(userId);
//绑定容器的其余部分。绑定。。。
返回容器;
}
异步({req,res})=>{
const{headers}=req;
const{userId}=头;
const container=ScopedContainer(clientId);
const context={container}
///...
}
willSendResponse(({container})=>{
//如何指示inversifyjs放弃对容器的所有引用?
//像集装箱之类的东西?
});
我想确保这个
容器在http请求完成后不会留在那里,从而导致巨大的内存泄漏。问题是,当引用计数达到零时,我不确定它是否会被垃圾收集。我还使用了
inversifyinjectdecorators


是否存在类似销毁或重置方法的
inversifyjs
容器
API?

inversify库中没有对容器实例的持久引用。它暂时由
\u plan和resolve
私有方法中的
上下文
引用,但返回后会被释放,因此无需担心

从概念上讲,容器实例应该是顶级解析器。系统中的所有其他服务都被container“拥有”,但除了userland代码之外,任何人都不应该拥有container

总之,只要你坚持以下规则:只在你的作文根目录中使用
容器
,就像在
inversify.config.ts
中一样,你是安全的


在您的示例中,不太明显的是有多少其他实体获得了
容器
引用。如果您只传递了express Middleware中的
上下文
对象,那么一旦请求处理完成,
上下文
就会被取消,等待被删除的
容器
也会被取消。无需进一步“清理”。

非express(前端而非后端)项目是否有办法保留单个容器引用,并将其重置为可以重新创建我需要注入/获取的服务的新实例?确定。容器只对IoC模式有帮助,至于您想如何使用它,完全取决于您。只需将其视为生成工作者/服务实例的主实体即可。您还可以在主控(容器)的顶部自由放置另一个监管实体。在不创建新容器的情况下重置该实例如何?有API/技巧可以做到这一点吗?@Zorgatone发布另一个问题,并用一些代码来说明问题,怎么样?我可以看看@海猿