Files
pig-farm-controller/design/设备删除前校验/plan_service_refactor.md
2025-11-02 18:11:48 +08:00

4.1 KiB
Raw Blame History

计划服务重构设计方案

1. 目标

internal/domain/scheduler 包重构为 internal/domain/plan,并创建一个新的 PlanService 对象,将原 scheduler 包中的核心调度逻辑集成到 PlanService 中作为一个子服务,统一由 PlanService 对外提供服务。此重构旨在提高代码的模块化、可维护性和可测试性,并为后续的“设备删除前校验”功能奠定基础。

2. 方案详情

2.1. 包重命名

  • internal/domain/scheduler 目录重命名为 internal/domain/plan
  • 修改 internal/domain/plan 目录下所有 Go 文件中的 package schedulerpackage plan
  • 更新 internal/domain/plan 目录下所有 Go 文件中所有引用 git.huangwc.com/pig/pig-farm-controller/internal/domain/scheduler 的导入路径为 git.huangwc.com/pig/pig-farm-controller/internal/domain/plan

2.2. internal/domain/plan 包内部结构调整

  • internal/domain/plan/task.go:

    • 保持不变。它定义了任务的接口和工厂,是领域内的核心抽象。
  • internal/domain/plan/scheduler.go:

    • Scheduler 结构体更名为 PlanExecutionManager。这个名称更准确地反映了它作为计划任务执行的协调者和管理者的角色。
    • NewScheduler 构造函数更名为 NewPlanExecutionManager
    • 文件内部所有对 Scheduler 的引用都将更新为 PlanExecutionManager
  • internal/domain/plan/analysis_plan_task_manager.go:

    • 保持不变。其名称 AnalysisPlanTaskManager 已经清晰地表达了其职责。

2.3. 创建 internal/app/service/plan_service.go

  • 创建新文件 internal/app/service/plan_service.go
  • 该文件将定义 PlanService 结构体,并包含 *plan.PlanExecutionManager*plan.AnalysisPlanTaskManager 的实例作为其依赖。
  • 实现 NewPlanService 构造函数,负责创建 plan.PlanExecutionManagerplan.AnalysisPlanTaskManager 实例,并将其注入到 PlanService 中。
  • PlanService 将对外提供高层次的 API这些 API 会协调调用 PlanExecutionManagerAnalysisPlanTaskManager 的方法。例如:
    • PlanService.Start() 方法会调用 PlanExecutionManager.Start()
    • PlanService.Stop() 方法会调用 PlanExecutionManager.Stop()
    • PlanService.RefreshPlanTriggers() 方法会调用 AnalysisPlanTaskManager.Refresh()
    • 未来所有与计划相关的应用层操作,都将通过 PlanService 进行。

2.4. 调整依赖注入和引用

  • 查找并替换导入路径: 使用 grep 命令查找整个项目中所有引用 git.huangwc.com/pig/pig-farm-controller/internal/domain/scheduler 的地方,并将其替换为 git.huangwc.com/pig/pig-farm-controller/internal/domain/plan
  • 更新 internal/core/component_initializers.go:
    • 在初始化阶段,我们将创建 plan.PlanExecutionManagerplan.AnalysisPlanTaskManager 的实例。
    • 然后,将这两个管理器实例注入到 service.NewPlanService 构造函数中,创建 PlanService 实例。
    • 应用程序的其他部分将通过 PlanService 来访问计划相关的逻辑,而不是直接访问底层的管理器。

3. 优势

  • 职责分离清晰: internal/domain/plan 包专注于计划领域的核心逻辑和管理,而 internal/app/service 包则负责应用层的业务编排和对外接口。
  • 符合领域驱动设计: 领域层包含核心业务逻辑和管理器,应用层作为领域层的协调者。
  • 与现有项目风格一致: 借鉴 domain/pig 包的模式,提高了项目内部的一致性。
  • 可测试性增强: PlanService 可以更容易地进行单元测试,因为其依赖的管理器可以被模拟。
  • 可维护性提高: 当计划相关的业务逻辑发生变化时,可以更精确地定位到需要修改的组件。

4. 验证和测试

在完成所有修改后,需要运行项目并进行测试,确保调度器功能正常,没有引入新的错误。