如何用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实例时用的是自定义Symboltypes.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
相关产品推荐
相关产品推荐

