5.5 KiB
		
	
	
	
	
	
	
	
			
		
		
	
	
			5.5 KiB
		
	
	
	
	
	
	
	
计划服务重构设计方案
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 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/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对外暴露的所有公共方法。 ExecutionManagerImpl和AnalysisPlanTaskManagerImpl将分别实现对应的接口。
 - 在 
 
2.3. 创建 internal/domain/plan/plan_service.go
- 
创建新文件
internal/domain/plan/plan_service.go。 - 
定义领域服务接口:
- 在 
internal/domain/plan包中定义Service接口,该接口将聚合ExecutionManager和AnalysisPlanTaskManager的所有公共方法,并由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.ExecutionManagerImpl和plan.AnalysisPlanTaskManagerImpl的具体实例。 - 然后,将这些具体实例作为 
plan.ExecutionManager接口和plan.AnalysisPlanTaskManager接口类型传递给plan.NewService构造函数,创建planServiceImpl实例。 - 最终,
plan.NewService返回plan.Service接口类型。 - 应用程序的其他部分将通过 
plan.Service接口来访问计划相关的逻辑,而不是直接访问底层的管理器或其具体实现。 
 - 在初始化阶段,我们将创建 
 
3. 优势
- 职责分离清晰: 
internal/domain/plan包专注于计划领域的核心逻辑和管理,并提供统一的Service接口作为领域服务的入口。 - 符合领域驱动设计: 领域层包含核心业务逻辑和管理器,应用层(如果需要)作为领域层的协调者。
 - 与现有项目风格一致: 借鉴 
domain/pig包的模式,提高了项目内部的一致性。 - 可测试性增强: 
Service可以更容易地进行单元测试,因为其依赖的接口可以被模拟。 - 可维护性提高: 当计划相关的业务逻辑发生变化时,可以更精确地定位到需要修改的组件。
 - 松耦合: 
Service不依赖于具体的实现,而是依赖于接口,提高了系统的灵活性和可扩展性。 
4. 验证和测试
在完成所有修改后,需要运行项目并进行测试,确保调度器功能正常,没有引入新的错误。