Typescript 在inversifyjs中重置作用域容器
我正在实现一个作用域容器体系结构,以便为每个Express请求(或apollographql请求)创建一个新的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
容器。我有一个生命周期方法,可以在发送响应后调用,这有助于清理和释放内存,并且该方法可以引用我们完成服务的请求的上下文。在该上下文中
我有一个对我先前创建的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发布另一个问题,并用一些代码来说明问题,怎么样?我可以看看@海猿