Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何将实例绑定到inversify容器_Javascript_Typescript_Express_Inversifyjs - Fatal编程技术网

Javascript 如何将实例绑定到inversify容器

Javascript 如何将实例绑定到inversify容器,javascript,typescript,express,inversifyjs,Javascript,Typescript,Express,Inversifyjs,我正在使用inversify和inversifyexpress-utils 我有一个非常常见的inversify/express设置 控制器 服务 模块 B模块 B模块是一个如下所示的类: 从'inversify'导入{injectable}; 从“拼写校正器”导入拼写校正器; @可注射() 出口级拼写校正器工厂{ 私人校正器:任何; 构造函数(){ this.corrector=新拼写校正器(); this.corrector.loadDictionary(); } pu

我正在使用
inversify
inversifyexpress-utils

我有一个非常常见的
inversify/express
设置

  • 控制器
    • 服务
      • 模块
        • B模块
B模块
是一个如下所示的类:

从'inversify'导入{injectable};
从“拼写校正器”导入拼写校正器;
@可注射()
出口级拼写校正器工厂{
私人校正器:任何;
构造函数(){
this.corrector=新拼写校正器();
this.corrector.loadDictionary();
}
public correct=(text:string):string=>this.corrector.correct(text);
}
现在,这里的问题是,正如您在构造函数中看到的,我有一行代码:

this.corrector.loadDictionary()
这一行需要一秒钟来执行。 因此,基本上,当I
@inject
service
B
to service
A
因此,每次我发出请求时,都会执行
SpellCorrectorFactory
的构造函数,因此请求将占用1000毫秒而不是100毫秒以下的时间

如何将该类绑定到inversify,以便在绑定过程中实例化该类,并且在
模块中
我可以访问在app start上创建的实例,而不是在我向express path发送请求时


提前谢谢

好的,以防万一有人看这页寻找答案

解决方案非常简单:

容器
.bind(类型.拼写更正器)
.to(拼写校正器工厂)
.inSingletonScope();
这将立即调用
SpellCorrectorFactory
的构造函数并返回实例。
因此,每当您注入此绑定的结果时,您都可以直接访问实例及其函数。

我从未使用过它,但粗略地看一下它们的文档,就会发现它们支持单例注册和异步工厂。后者在IOC容器中是一个罕见的特性。更重要的是,为什么不注入
拼写更正器
?事实上,您直接创建的依赖项抵消了使用这种框架的好处当您说“bind”时,您是指setter注入吗?如果是这样的话,这是一种糟糕的做法。我说的是构造函数注入:
构造函数(@inject(SpellCorrector)corrector:SpellCorrector){}
。这是一个有趣的框架,但我也是新手。
loadDictionary
是如何工作的?它应该返回一个
承诺
。如果正在执行同步IO,则必须停止。JavaScript应用程序是单线程的。如果它返回一个
承诺
,您可以在inversify中注册一个异步提供程序。是的,它确实有意义。但是,由于构造函数是同步的,并且您说这需要
loadDictionary
1000毫秒以上的时间,所以会阻止启动。我在问你
loadDictionary
是如何工作的。它在执行同步IO吗?这很重要。如果它是一个异步IO操作,那么您的
SpellCorrectorFactory
在创建时处于初始无效状态,这是因为您是如何构造它的。它使用的
fs.readFileSync
非常糟糕。JS是单线程的。这意味着您的应用程序已100%冻结,无法在加载文件时执行任何其他操作。如果编写正确,它将使用
fs.promises.readFile
。然后,您可以将其注册为一个单例,由异步工厂提供,在inversify中记录在案,解决所有问题。严肃地说,除了CLI工具,我不能夸大JS应用程序、客户端或服务器中的同步IO有多大问题
toFactory
的链接方式不同。