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
相关产品推荐
相关产品推荐

