我正在实现一个作用域容器体系结构,以便为每个快捷请求(或apollographql请求)创建一个新的container。我有一个生命周期方法,可以在发送响应之后调用,这有利于清理和释放内存,而且这个方法可以引用我们服务的请求的上下文。在那个context中,我引用了我前面创建的inversifyjs container,这样我就可以在清理方法中引用container,如何才能delete that 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请求之后,这个container不会停留在那里,这会导致巨大的内存泄漏。问题是,当引用计数到达零时,我不确定它是否会被垃圾收集。我也在使用来自inversify-inject-decorators的inversify-inject-decorators
是否有类似于破坏或重置方法的inversifyjs container API?
发布于 2021-03-26 10:44:10
在反版本库中没有对容器实例的持久引用。它暂时由Context在_planAndResolve私有方法中引用,但在返回时发布,所以不用担心。
从概念上讲,容器实例应该是顶级解析器。系统中的所有其他服务都是由容器“拥有”的,但是除了用户代码之外,没有人应该拥有容器。
恩,只要您坚持规则:只在组合根中使用,就像在inversify.config.ts中一样,您是安全的。
在您的示例中,不太明显的是有多少其他实体持有container引用。如果您传递的只是context对象,那么一旦完成请求处理,context就会被删除,container也会等待成为GC。没有必要做进一步的“清理”。
https://stackoverflow.com/questions/65472688
复制相似问题