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

Inversify绑定多个ICommandHandler时抛出Ambiguous match错误求助

解决InversifyJS多绑定触发"Ambiguous match found"错误

你遇到的问题核心是:注入多绑定依赖时误用了普通@inject装饰器,而非@multiInject。当同一个服务标识符绑定了多个实现类后,InversifyJS无法通过普通注入方式确定返回哪一个实例,因此抛出歧义匹配错误。

修复步骤

1. 修改App类的注入逻辑

在App类中,注入CommandHandlers的位置必须替换为@multiInject装饰器,同时将参数类型声明为数组:

import { injectable, multiInject } from "inversify";
import { ICommandHandler } from "./your-interface-path";
import { TYPES } from "./your-types-path";

@injectable()
export class App {
  constructor(
    // 用multiInject替代inject,类型定义为数组
    @multiInject(TYPES.CommandHandlers) private readonly commandHandlers: ICommandHandler[]
  ) {
    // 后续可通过this.commandHandlers访问所有命令处理器实例
  }
}

2. 容器绑定无需改动

你当前的容器绑定代码是正确的,保持原样即可:

const SAContainer = new Container();

// Bot Command Handler bindings
SAContainer.bind<ICommandHandler>(TYPES.CommandHandlers).to(AboutCommand);
SAContainer.bind<ICommandHandler>(TYPES.CommandHandlers).to(AccountAgeCommand);

SAContainer.bind<App>(App).toSelf().inSingletonScope();

补充说明

  • 单绑定场景下InversifyJS会默认返回唯一实例,但这属于“兼容行为”,多绑定场景必须严格使用multiInject(或容器的getAll方法)。
  • 如果需要在容器外部直接获取所有绑定实例,需使用getAll而非get:
    const allHandlers = SAContainer.getAll<ICommandHandler>(TYPES.CommandHandlers);
    

内容的提问来源于stack exchange,提问作者Itanex

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 15:27:25