在inversifyjs中重置作用域容器

4

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

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?
});


我希望确保这个容器在http请求完成后不会停留在那里,导致巨大的内存泄漏。问题是我不确定它是否会在引用计数到达零时被垃圾回收。我还使用了inversify-inject-decorators中的lazyInject

是否有任何inversifyjs container API 像销毁或重置方法?

1个回答

3

在 inversify 库中,没有容器实例的持久引用。它在 _planAndResolve 私有方法中由 Context 临时引用,但在返回后被释放,所以不用担心。

从概念上讲,容器实例应该是顶级解析器。系统中的所有其他服务都“属于”容器,但除了用户代码之外,没有人应该拥有容器。

简而言之,只要遵循规则:只在组合根中使用 container,比如在 inversify.config.ts 中,就是安全的。

在你的示例中,很难确定有多少其他实体会持有 container 引用。如果仅是将其传递给 Express 中间件的 context 对象,那么一旦处理请求完成,context 和等待进行垃圾回收的 container 都会被取消引用。不需要进一步的“清理”。


非 Express 项目(前端而不是后端)是否有一种方法可以保持单个容器引用,并以重新创建我需要注入/获取的服务的方式重置它? - Zorgatone
当然。容器只有在IoC模式下有所帮助,至于您想如何使用它,完全取决于您。只需将其视为生成工作程序/服务实例的主实体。您可以自由地在该主(容器)之上放置另一个监督实体。 - hackape
重置该实例,而不创建新容器怎么样? 有没有可以做到这一点的API / 技巧? - Zorgatone
@Zorgatone,要不您再发一个带有代码的问题?我可以看一下。 - hackape
https://stackoverflow.com/questions/66820199 @hackape - Zorgatone

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接