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

如何用Inversify注入Sequelize实例?绑定匹配报错解决

问题描述

我使用sequelize-typescript定义了一个MySQL数据库对象:

const DBInstance = new Sequelize(config.db.database, config.db.username, config.db.password, {
  host: config.db.host,
  dialect: config.db.dialect as Dialect,
  repositoryMode: true,
});

export default DBInstance;

随后尝试将该实例注入到仓库类中:

@injectable()
export default class AppDataRepository implements IAppMetaDataRepository {
  private readonly repository: Repository<AppData>;

  constructor(db: Sequelize) {
    this.repository = db.getRepository(AppMetaData);
  }

  findOne = async (): Promise<AppEntity | null> => {
    const result = await this.repository.findOne<AppData>();
    if (!result) {
      return null;
    }
    const data = result.get();
    return new AppDataEntity(data.id, data.name, data.version, data.createdAt, data.updatedAt);
  };
}

绑定配置如下:

import MySqlInstance from '@DBConnection/MysqlInstance';

container.bind<Sequelize>(types.INVERSIFY_SYMBOL.Sequelize).toConstantValue(MySqlInstance);

其中MySqlInstance即导出的DBInstance实例,但运行时仍报错:

No matching bindings found for serviceIdentifier: Sequelize {"stack":"Error: No matching bindings found for serviceIdentifier: Sequelize

需要使用初始化时指定配置的Sequelize实例,请问如何通过Inversify正确实现?

解决方案
  • 统一注入标识
    你绑定Sequelize实例时用的是自定义Symbol types.INVERSIFY_SYMBOL.Sequelize,但仓库类构造函数里直接用Sequelize类作为注入标识,两者不匹配导致无法找到绑定。必须在构造函数中通过@inject装饰器明确指定绑定的Symbol:

    import { injectable, inject } from 'inversify';
    import { Sequelize, Repository } from 'sequelize-typescript';
    import types from './path-to-your-types-file'; // 替换为你的types文件路径
    
    @injectable()
    export default class AppDataRepository implements IAppMetaDataRepository {
      private readonly repository: Repository<AppData>;
    
      // 加上@inject装饰器,传入对应的Symbol
      constructor(@inject(types.INVERSIFY_SYMBOL.Sequelize) db: Sequelize) {
        this.repository = db.getRepository(AppMetaData);
      }
    
      // ... 原有方法
    }
    
  • 确保实例初始化完成后再绑定
    如果数据库连接是异步初始化的,要先等待连接验证完成再绑定到容器,避免实例未就绪:

    // 先验证数据库连接
    await MySqlInstance.authenticate();
    // 再将实例绑定到容器
    container.bind<Sequelize>(types.INVERSIFY_SYMBOL.Sequelize).toConstantValue(MySqlInstance);
    
  • 检查容器实例与仓库绑定
    确保获取AppDataRepository时使用的是同一个容器实例,且仓库类本身已正确绑定:

    // 绑定仓库类(如果未绑定的话)
    container.bind<IAppMetaDataRepository>(types.INVERSIFY_SYMBOL.AppDataRepository).to(AppDataRepository);
    // 获取仓库实例
    const repo = container.get<IAppMetaDataRepository>(types.INVERSIFY_SYMBOL.AppDataRepository);
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 08:07:52