You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

InversifyJS动态绑定动态导入类型失败,求解决办法

解决InversifyJS动态异步绑定找不到绑定的问题

这个问题的核心在于异步操作的时序问题——你用import()动态加载模块是异步的,但后续调用container.get()的时候,这些异步的绑定操作还没完成,容器里根本没注册对应的服务,自然会抛出"No matching bindings found"的错误。

修复步骤:

  1. 将bind()方法改为异步函数,使用Promise.all等待所有动态导入和绑定操作完成
  2. 在尝试获取容器实例之前,必须等待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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:35:59