/** * DomainManager工厂类 */ import { StorageAdapter } from '../interfaces/StorageAdapter'; import { DomainManager } from '../interfaces/DomainManager'; import { DomainManagerImpl } from './DomainManagerImpl'; import { DomainDAO } from '../interfaces/DomainDAO'; import { DomainDAOImpl } from './DomainDAOImpl'; import { StorageConfig, DomainManagerConfig } from '../interfaces/common'; import { DatabaseError } from '../exceptions/DatabaseError'; /** * DomainManagerFactory,用于创建DomainManager实例 */ export class DomainManagerFactory { /** * 创建DomainManager实例 * @param adapter 存储适配器 * @param config 存储配置(可选,如果适配器已初始化则不需要) * @returns Promise DomainManager实例 */ public static async create(adapter: StorageAdapter, config?: StorageConfig): Promise { try { // 如果提供了配置且适配器尚未初始化,则初始化适配器 if (config) { await adapter.initialize(config); } // 创建DAO实例 const dao: DomainDAO = new DomainDAOImpl(adapter); await dao.initialize(); // 创建并返回DomainManager实例 const domainManager: DomainManager = new DomainManagerImpl(dao); return domainManager; } catch (error) { throw new DatabaseError(`Failed to create DomainManager: ${error instanceof Error ? error.message : String(error)}`); } } /** * 根据配置创建DomainManager实例 * @param config 域名管理器配置 * @returns Promise DomainManager实例 */ public static async createFromConfig(config: DomainManagerConfig): Promise { try { // 导入StorageFactory const { StorageFactory } = await import('../adapters/StorageFactory'); // 创建适配器实例 const adapter = StorageFactory.createAdapter(config.persistence.storageType); // 创建并返回DomainManager实例 return this.create(adapter, config.persistence.storageConfig); } catch (error) { throw new DatabaseError(`Failed to create DomainManager from config: ${error instanceof Error ? error.message : String(error)}`); } } /** * 创建DomainManager实例(同步方法) * @param adapter 存储适配器 * @returns DomainManager DomainManager实例 */ public static createSync(adapter: StorageAdapter): DomainManager { // 创建DAO实例 const dao: DomainDAO = new DomainDAOImpl(adapter); // 创建并返回DomainManager实例 const domainManager: DomainManager = new DomainManagerImpl(dao); return domainManager; } }