You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

108 lines
2.6 KiB

// 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.LoadConfig()
if err != nil {
return fmt.Errorf("加载配置失败: %w", err)
}
// 初始化数据库
db, err := database.NewDB(&cfg.DB)
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("停止模块失败", zap.String("module", name), zap.Error(err))
}
}
return nil
}