Files
pig-farm-controller/design/verification-before-device-deletion/plan_service_refactor.md
2025-11-02 19:33:05 +08:00

5.5 KiB
Raw Blame History

计划服务重构设计方案

1. 目标

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

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/plan_execution_manager.go:

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

    • AnalysisPlanTaskManager 结构体更名为 AnalysisPlanTaskManagerImpl
    • NewAnalysisPlanTaskManager 构造函数更名为 NewAnalysisPlanTaskManagerImpl
    • 文件内部所有对 AnalysisPlanTaskManager 的引用都将更新为 AnalysisPlanTaskManagerImpl
  • 定义领域层接口:

    • internal/domain/plan 包中定义 ExecutionManager 接口,包含 ExecutionManagerImpl 对外暴露的所有公共方法。
    • internal/domain/plan 包中定义 AnalysisPlanTaskManager 接口,包含 AnalysisPlanTaskManagerImpl 对外暴露的所有公共方法。
    • ExecutionManagerImplAnalysisPlanTaskManagerImpl 将分别实现对应的接口。

2.3. 创建 internal/domain/plan/plan_service.go

  • 创建新文件 internal/domain/plan/plan_service.go

  • 定义领域服务接口:

    • internal/domain/plan 包中定义 Service 接口,该接口将聚合 ExecutionManagerAnalysisPlanTaskManager 的所有公共方法,并由 planServiceImpl 实现这些方法的委托。
  • 实现领域服务:

    • 该文件将定义 planServiceImpl 结构体,并包含 ExecutionManager 接口和 AnalysisPlanTaskManager 接口的实例作为其依赖。
    • 实现 NewService 构造函数,负责接收 ExecutionManager 接口和 AnalysisPlanTaskManager 接口的实例,并将其注入到 planServiceImpl 中。
    • planServiceImpl 将对外提供高层次的 API这些 API 会协调调用其依赖的接口方法。例如:
      • Service.Start() 方法会调用 ExecutionManager 接口的 Start() 方法。
      • Service.Stop() 方法会调用 ExecutionManager 接口的 Stop() 方法。
      • Service.RefreshPlanTriggers() 方法会调用 AnalysisPlanTaskManager 接口的 Refresh() 方法。
      • Service.CreateOrUpdateTrigger() 方法会调用 AnalysisPlanTaskManager 接口的 CreateOrUpdateTrigger() 方法。
      • Service.EnsureAnalysisTaskDefinition() 方法会调用 AnalysisPlanTaskManager 接口的 EnsureAnalysisTaskDefinition() 方法。
      • 未来所有与计划相关的领域操作,都将通过 Service 接口进行。

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.ExecutionManagerImplplan.AnalysisPlanTaskManagerImpl 的具体实例。
    • 然后,将这些具体实例作为 plan.ExecutionManager 接口和 plan.AnalysisPlanTaskManager 接口类型传递给 plan.NewService 构造函数,创建 planServiceImpl 实例。
    • 最终,plan.NewService 返回 plan.Service 接口类型。
    • 应用程序的其他部分将通过 plan.Service 接口来访问计划相关的逻辑,而不是直接访问底层的管理器或其具体实现。

3. 优势

  • 职责分离清晰: internal/domain/plan 包专注于计划领域的核心逻辑和管理,并提供统一的 Service 接口作为领域服务的入口。
  • 符合领域驱动设计: 领域层包含核心业务逻辑和管理器,应用层(如果需要)作为领域层的协调者。
  • 与现有项目风格一致: 借鉴 domain/pig 包的模式,提高了项目内部的一致性。
  • 可测试性增强: Service 可以更容易地进行单元测试,因为其依赖的接口可以被模拟。
  • 可维护性提高: 当计划相关的业务逻辑发生变化时,可以更精确地定位到需要修改的组件。
  • 松耦合: Service 不依赖于具体的实现,而是依赖于接口,提高了系统的灵活性和可扩展性。

4. 验证和测试

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