我在不使用 ORM 工具的情况下支持多个数据库。对于这个例子,我将展示一个 Postgres 和 MSSQL UserQueries的例子
我有一个接口IDataBase
,多个数据库实现了这个接口。
@injectable()
export class MssqlDatabase implements IDatabase {
public async connect(): Promise<void> {
}
public async disconnect(): Promise<void> {
}
}
此外,我的IUserQueries
界面定义了查询
export interface IUserQueries {
fetchUsers(): Promise<QueryResult>;
}
QueryResult
是一个自定义类,以确保每个数据库查询都为我的 API 返回相同的数据对象。我的 API 从目标接口调用特定查询。如果mssql
是配置文件中的标识符,我的应用程序应该创建到 MSSQL 数据库的连接。但是我的 API 文件不应该关心并且不知道这一点(显然,这就是接口的作用)。
一个基本的例子是
@injectable()
export class UserRepository implements IUserRepository {
public userQueries: IUserQueries;
constructor(@inject(IoCTypes.IUserQueries) userQueries: IUserQueries) {
this.userQueries = userQueries;
}
}
现在事情变得棘手了。我的 DI 容器:
const container: Container = new Container();
container.bind<IUserQueries>(IoCTypes.IUserQueries).to(/* what? */);
export { container };
DI 容器不知道选择哪个查询文件。它可能是MSSQLUserQueries
or PostgresUserQueries
。我怎么解决这个问题?启动服务器( app.ts )时可以选择正确的查询,但据我了解,这个 DI 容器完全独立于应用程序,只是充当配置文件,所以我不应该传入抽象UserQueries
类.