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
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.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 |
|
}
|
|
|