/** * 存储适配器工厂类 * 用于创建不同类型的存储适配器实例,支持插件化扩展 */ import { StorageAdapter, StorageConfig } from '../interfaces/StorageAdapter'; /** * 内置存储类型枚举 */ export enum StorageType { // 数据库类型 MySQL = 'mysql', MongoDB = 'mongodb', PostgreSQL = 'postgresql', SQLite = 'sqlite', // 非数据库类型 FileSystem = 'fileSystem', Memory = 'memory', Redis = 'redis', AWS_S3 = 'awsS3' } /** * 存储适配器注册器接口 */ export interface StorageAdapterCreator { /** * 创建存储适配器实例的方法 * @returns 存储适配器实例 */ create(): any; // 使用 any 类型以避免类型兼容性问题 } /** * 存储工厂类 - 支持插件化扩展 */ export class StorageFactory { // 存储适配器创建器注册表 private static adapterRegistry: Map = new Map(); /** * 注册存储适配器创建器 * @param type 存储类型标识 * @param creator 适配器创建器实现 */ public static registerAdapter(type: string, creator: StorageAdapterCreator): void { this.adapterRegistry.set(type, creator); } /** * 注销存储适配器创建器 * @param type 存储类型标识 * @returns 是否成功注销 */ public static unregisterAdapter(type: string): boolean { return this.adapterRegistry.delete(type); } /** * 获取所有已注册的存储类型 * @returns 已注册的存储类型数组 */ public static getRegisteredTypes(): string[] { return Array.from(this.adapterRegistry.keys()); } /** * 创建存储适配器实例 * @param type 存储类型标识 * @returns 存储适配器实例 * @throws Error 当未找到对应类型的适配器时抛出错误 */ public static createAdapter(type: string | StorageType): StorageAdapter { const adapterCreator = this.adapterRegistry.get(type.toString()); if (!adapterCreator) { throw new Error(`No storage adapter registered for type '${type}'`); } return adapterCreator.create() as unknown as StorageAdapter; } /** * 根据配置创建并初始化存储适配器实例 * @param config 存储配置 * @returns Promise 初始化后的存储适配器实例 */ public static async createAndInitializeAdapter(config: StorageConfig): Promise { const adapter = this.createAdapter(config.type); await adapter.initialize(config); return adapter; } /** * 检查存储类型是否已注册 * @param type 存储类型标识 * @returns 是否已注册 */ public static isTypeRegistered(type: string): boolean { return this.adapterRegistry.has(type); } }