UNPKG

fu-orm-code-generator

Version:

A Model Context Protocol (MCP) server for MyBatis code generation with enterprise-grade layered architecture

227 lines (192 loc) 7.44 kB
/** * 依赖注入容器 * 管理应用中所有依赖的创建和生命周期 */ import { config, initConfig } from '../../config/index.js'; /** * 简单的依赖注入容器 */ export class Container { constructor() { this.services = new Map(); this.singletons = new Map(); } /** * 注册服务 * @param {string} name - 服务名称 * @param {Function|Object} factory - 工厂函数或实例 * @param {Object} [options] - 选项 * @param {boolean} [options.singleton=false] - 是否单例 * @param {string[]} [options.dependencies=[]] - 依赖列表 */ register(name, factory, options = {}) { const { singleton = false, dependencies = [] } = options; this.services.set(name, { factory, singleton, dependencies, instance: null }); } /** * 注册单例服务 * @param {string} name - 服务名称 * @param {Function|Object} factory - 工厂函数或实例 * @param {string[]} [dependencies=[]] - 依赖列表 */ registerSingleton(name, factory, dependencies = []) { this.register(name, factory, { singleton: true, dependencies }); } /** * 获取服务实例 * @param {string} name - 服务名称 * @returns {any} 服务实例 */ resolve(name) { const service = this.services.get(name); if (!service) { throw new Error(`Service "${name}" not found`); } // 如果是单例且已创建实例,直接返回 if (service.singleton && service.instance) { return service.instance; } // 解析依赖 const dependencies = service.dependencies.map(dep => this.resolve(dep)); // 创建实例 let instance; if (typeof service.factory === 'function') { instance = new service.factory(...dependencies); } else { instance = service.factory; } // 如果是单例,缓存实例 if (service.singleton) { service.instance = instance; } return instance; } /** * 检查服务是否已注册 * @param {string} name - 服务名称 * @returns {boolean} 是否已注册 */ has(name) { return this.services.has(name); } /** * 获取所有已注册的服务名称 * @returns {string[]} 服务名称列表 */ getServiceNames() { return Array.from(this.services.keys()); } /** * 清除所有服务 */ clear() { this.services.clear(); this.singletons.clear(); } /** * 移除指定服务 * @param {string} name - 服务名称 * @returns {boolean} 是否成功移除 */ remove(name) { this.singletons.delete(name); return this.services.delete(name); } } /** * 配置和初始化容器 * @returns {Promise<Container>} 配置好的容器实例 */ export async function createContainer() { // 初始化配置 initConfig(); const container = new Container(); // 注册配置 container.registerSingleton('config', config); // 注册基础设施层 const { HttpClient } = await import('../http/HttpClient.js'); const { FileSystem } = await import('../filesystem/FileSystem.js'); const { FileSystemService } = await import('../services/FileSystemService.js'); const { Validator } = await import('../validation/Validator.js'); container.registerSingleton('httpClient', HttpClient); container.registerSingleton('fileSystem', FileSystem); container.registerSingleton('fileSystemService', FileSystemService, ['config']); container.registerSingleton('validator', Validator); // 注册仓储实现 const { TemplateRepositoryImpl } = await import('../repositories/TemplateRepositoryImpl.js'); const { ConfigRepositoryImpl } = await import('../repositories/ConfigRepositoryImpl.js'); container.registerSingleton('templateRepository', TemplateRepositoryImpl, ['httpClient', 'fileSystem']); container.registerSingleton('configRepository', ConfigRepositoryImpl, ['fileSystem']); // 注册应用服务 const { TemplateApplicationService } = await import('../../application/services/TemplateApplicationService.js'); const { ConfigApplicationService } = await import('../../application/services/ConfigApplicationService.js'); const { CodeGenerationService } = await import('../../application/services/CodeGenerationService.js'); container.registerSingleton('templateApplicationService', TemplateApplicationService, [ 'templateRepository', 'configRepository', 'validator' ]); container.registerSingleton('configApplicationService', ConfigApplicationService, [ 'configRepository', 'validator' ]); container.registerSingleton('codeGenerationService', CodeGenerationService, [ 'templateRepository', 'configApplicationService', 'fileSystemService' ]); // 注册工具处理器 const { VisitOnlineTemplatesHandler } = await import('../../presentation/tools/VisitOnlineTemplatesHandler.js'); const { DownloadOnlineTemplateHandler } = await import('../../presentation/tools/DownloadOnlineTemplateHandler.js'); const { ChooseLocalTemplateHandler } = await import('../../presentation/tools/ChooseLocalTemplateHandler.js'); const { VisitLocalTemplatesHandler } = await import('../../presentation/tools/VisitLocalTemplatesHandler.js'); const { EditLocalTemplatesHandler } = await import('../../presentation/tools/EditLocalTemplatesHandler.js'); // 新增:用户信息管理工具处理器 const { SetUserInfoHandler } = await import('../../presentation/tools/SetUserInfoHandler.js'); const { GetUserInfoHandler } = await import('../../presentation/tools/GetUserInfoHandler.js'); // 新增:表前缀管理工具处理器 const { SetTablePrefixHandler } = await import('../../presentation/tools/SetTablePrefixHandler.js'); const { GetTablePrefixHandler } = await import('../../presentation/tools/GetTablePrefixHandler.js'); // 新增:代码生成工具处理器 const { GenerateOrmCodeHandler } = await import('../../presentation/tools/GenerateOrmCodeHandler.js'); // 模板管理工具处理器 container.register('visitOnlineTemplatesHandler', VisitOnlineTemplatesHandler, { dependencies: ['templateApplicationService'] }); container.register('downloadOnlineTemplateHandler', DownloadOnlineTemplateHandler, { dependencies: ['templateApplicationService'] }); container.register('chooseLocalTemplateHandler', ChooseLocalTemplateHandler, { dependencies: ['templateApplicationService'] }); container.register('visitLocalTemplatesHandler', VisitLocalTemplatesHandler, { dependencies: ['templateApplicationService'] }); container.register('editLocalTemplatesHandler', EditLocalTemplatesHandler, { dependencies: ['templateApplicationService'] }); // 用户信息管理工具处理器 container.register('setUserInfoHandler', SetUserInfoHandler, { dependencies: ['configApplicationService'] }); container.register('getUserInfoHandler', GetUserInfoHandler, { dependencies: ['configApplicationService'] }); // 表前缀管理工具处理器 container.register('setTablePrefixHandler', SetTablePrefixHandler, { dependencies: ['configApplicationService'] }); container.register('getTablePrefixHandler', GetTablePrefixHandler, { dependencies: ['configApplicationService'] }); // 代码生成工具处理器 container.register('generateOrmCodeHandler', GenerateOrmCodeHandler, { dependencies: ['codeGenerationService'] }); return container; }