InversifyJS动态绑定动态导入类型失败,求解决办法
解决InversifyJS动态异步绑定找不到绑定的问题
这个问题的核心在于异步操作的时序问题——你用import()动态加载模块是异步的,但后续调用container.get()的时候,这些异步的绑定操作还没完成,容器里根本没注册对应的服务,自然会抛出"No matching bindings found"的错误。
修复步骤:
- 将
bind()方法改为异步函数,使用Promise.all等待所有动态导入和绑定操作完成 - 在尝试获取容器实例之前,必须等待
bind()方法执行完毕
修改后的代码示例:
首先更新bind()方法:
async bind(): Promise<void> { // 使用map+Promise.all确保所有绑定都完成后再继续 await Promise.all(this.templates.map(async (template) => { const mod = await import(template.file); // 绑定逻辑和你原来的一致,只是放到了async/await里 this.container.bind<ITemplate>(template.obj).to(mod.default); console.log('bound =>', mod.default); })); }
然后在调用绑定和获取实例的地方,要等待绑定完成:
// 比如在你的初始化方法中 async initializeTemplates() { // 先等待所有绑定完成 await this.bind(); // 现在再去获取实例就不会报错了 this.templates.forEach(template => { const tpl = this.container.get<ITemplate>(template.obj); // 这里处理你的模板逻辑 }); }
为什么原来的写法不行?
你原来用forEach配合import().then()的时候,这些then回调都是异步执行的,不会阻塞后续代码的运行。也就是说,你调用container.get()的时候,很可能这些绑定的回调还没执行,容器里根本没有注册HtmlTemplate和ComponentTemplate的绑定,所以必然会报错。
而Promise.all会等待所有动态导入和绑定的Promise都resolve之后,才会继续执行后续代码,这样就能保证在调用get()的时候,所有需要的绑定都已经注册到容器里了。
另外从你的控制台输出来看,mod.default确实是正确的类,所以这部分没有问题,完全是异步时序的锅。
内容的提问来源于stack exchange,提问作者wendellmva
相关产品推荐
相关产品推荐

