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

58 lines
4.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 计划服务重构设计方案
## 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 scheduler``package 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.PlanExecutionManager``plan.AnalysisPlanTaskManager` 实例,并将其注入到 `PlanService` 中。
* `PlanService` 将对外提供高层次的 API这些 API 会协调调用 `PlanExecutionManager``AnalysisPlanTaskManager` 的方法。例如:
* `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.PlanExecutionManager``plan.AnalysisPlanTaskManager` 的实例。
* 然后,将这两个管理器实例注入到 `service.NewPlanService` 构造函数中,创建 `PlanService` 实例。
* 应用程序的其他部分将通过 `PlanService` 来访问计划相关的逻辑,而不是直接访问底层的管理器。
## 3. 优势
* **职责分离清晰:** `internal/domain/plan` 包专注于计划领域的核心逻辑和管理,而 `internal/app/service` 包则负责应用层的业务编排和对外接口。
* **符合领域驱动设计:** 领域层包含核心业务逻辑和管理器,应用层作为领域层的协调者。
* **与现有项目风格一致:** 借鉴 `domain/pig` 包的模式,提高了项目内部的一致性。
* **可测试性增强:** `PlanService` 可以更容易地进行单元测试,因为其依赖的管理器可以被模拟。
* **可维护性提高:** 当计划相关的业务逻辑发生变化时,可以更精确地定位到需要修改的组件。
## 4. 验证和测试
在完成所有修改后,需要运行项目并进行测试,确保调度器功能正常,没有引入新的错误。