// internal/core/manager.go package core import ( "fmt" "log" "sync" "gofaster/internal/shared/config" "gofaster/internal/shared/database" "github.com/gin-gonic/gin" "go.uber.org/zap" "gorm.io/gorm" ) // ModuleManager 模块管理器 type ModuleManager struct { modules map[string]Module mutex sync.RWMutex logger *zap.Logger } // NewModuleManager 创建新的模块管理器 func NewModuleManager(logger *zap.Logger) *ModuleManager { return &ModuleManager{ modules: make(map[string]Module), logger: logger, } } // RegisterModule 注册模块 func (m *ModuleManager) RegisterModule(module Module) { m.mutex.Lock() defer m.mutex.Unlock() m.modules[module.Name()] = module log.Printf("✅ 模块 %s 注册成功", module.Name()) } // GetModule 获取模块 func (m *ModuleManager) GetModule(name string) (Module, bool) { m.mutex.RLock() defer m.mutex.RUnlock() module, exists := m.modules[name] return module, exists } // InitModules 初始化所有模块 func (m *ModuleManager) InitModules(cfg *config.Config, db *gorm.DB, redis *database.RedisClient) error { m.mutex.Lock() defer m.mutex.Unlock() for name, module := range m.modules { m.logger.Info("初始化模块", zap.String("module", name)) if err := module.Init(cfg, m.logger, db, redis); err != nil { return fmt.Errorf("初始化模块 %s 失败: %w", name, err) } m.logger.Info("模块初始化成功", zap.String("module", name)) } return nil } // RegisterRoutes 注册所有模块的路由 func (m *ModuleManager) RegisterRoutes(router *gin.RouterGroup) { m.mutex.RLock() defer m.mutex.RUnlock() for name, module := range m.modules { m.logger.Info("注册模块路由", zap.String("module", name)) module.RegisterRoutes(router) m.logger.Info("模块路由注册完成", zap.String("module", name)) } } // Start 启动所有模块 func (m *ModuleManager) Start() error { // 加载配置 cfg, err := config.Load() if err != nil { return fmt.Errorf("加载配置失败: %w", err) } // 初始化数据库 db, err := database.New(cfg.Database) if err != nil { return fmt.Errorf("初始化数据库失败: %w", err) } // 启动所有模块 for name, module := range m.modules { if err := module.Start(cfg, db); err != nil { return fmt.Errorf("启动模块 %s 失败: %w", name, err) } log.Printf("✅ 模块 %s 启动成功", name) } return nil } // Stop 停止所有模块 func (m *ModuleManager) Stop() error { for name, module := range m.modules { if err := module.Stop(); err != nil { m.logger.Error("停止模块失败", "module", name, "error", err) } } return nil }