9.7 KiB
9.7 KiB
1. 准备工作
- 1.1 阅读并理解
openspec/changes/refactor-business-logic-layering/proposal.md。 - 1.2 阅读并理解
openspec/changes/refactor-business-logic-layering/design.md。 - 1.3 阅读并理解 'AGENTS.md'
2. 统一服务层接口输入输出为 DTO
2.1 monitor 模块
- 2.1.1 修改
internal/app/service/monitor_service.go:- 将所有
List...方法的opts repository.ListOptions参数替换为服务层自定义的查询 DTO 或一系列基本参数。 - 将所有
List...方法的返回值[]models.Xxx替换为[]dto.XxxResponse。 - 调整
List...方法的实现,在服务层内部将服务层查询 DTO 转换为repository.ListOptions。 - 调整
List...方法的实现,在服务层内部将repository返回的models对象转换为dto.XxxResponse。
- 将所有
- 2.1.2 修改
internal/app/controller/monitor/monitor_controller.go:- 移除控制器中构建
repository.ListOptions的逻辑。 - 移除控制器中将
models转换为dto.NewList...Response的逻辑。 - 移除控制器中直接使用
models进行枚举类型转换的逻辑,将其下沉到服务层或 DTO 转换逻辑中。 - 调整服务层方法的调用,使其接收新的服务层查询 DTO 或基本参数,并直接处理服务层返回的
dto.XxxResponse。
- 移除控制器中构建
2.2 device 模块
- 2.2.1 创建并修改
internal/app/service/device_service.go:- 定义
DeviceService接口,包含CreateDevice,UpdateDevice,CreateAreaController,UpdateAreaController,CreateDeviceTemplate,UpdateDeviceTemplate,GetDevice,ListDevices,GetAreaController,ListAreaControllers,GetDeviceTemplate,ListDeviceTemplates,ManualControl等方法。 - 为
CreateDevice,UpdateDevice,CreateAreaController,UpdateAreaController,CreateDeviceTemplate,UpdateDeviceTemplate,ManualControl方法定义并接收 DTO 作为输入。 - 将
GetDevice,ListDevices,GetAreaController,ListAreaControllers,GetDeviceTemplate,ListDeviceTemplates方法的返回值models.Xxx或[]models.Xxx替换为dto.XxxResponse或[]dto.XxxResponse。 - 实现
DeviceService接口。 - 在此服务层内部将输入 DTO 转换为
models对象。 - 在此服务层内部将
repository或domain层返回的models对象转换为dto.XxxResponse。 - 将控制器中
SelfCheck()验证逻辑移入此服务层。 - 将控制器中
Properties,Commands,Values的 JSON 序列化逻辑移入此服务层。 - 将控制器中
ManualControl的业务逻辑(如动作映射)移入此服务层。 - 将控制器中直接调用
repository方法的逻辑移入此服务层。 - 将控制器中通过检查
repository错误信息处理业务规则的逻辑移入此服务层。 - 调整此服务层对
internal/domain/device.Service的调用,确保传递的是models或领域对象,而不是 DTO。
- 定义
- 2.2.2 修改
internal/app/controller/device/device_controller.go:- 引入并使用新创建的
internal/app/service.DeviceService。 - 移除控制器中直接创建
models.Device,models.AreaController,models.DeviceTemplate对象的逻辑。 - 移除控制器中直接调用
SelfCheck()的逻辑。 - 移除控制器中直接调用
repository方法的逻辑。 - 移除控制器中通过检查
repository错误信息处理业务规则的逻辑。 - 移除控制器中
Properties,Commands,Values的 JSON 序列化逻辑。 - 调整服务层方法的调用,使其接收新的服务层输入 DTO 或基本参数,并直接处理服务层返回的
dto.XxxResponse。
- 引入并使用新创建的
- 2.2.3 修改
internal/core/component_initializers.go:创建并提供新的DeviceService。 - 2.2.4 修改
internal/app/api/api.go:更新DeviceController的依赖注入。
2.3 pig-farm 模块
- 2.3.1 修改
internal/app/service/pig_farm_service.go:- 将
CreatePigHouse,GetPigHouseByID,ListPigHouses,UpdatePigHouse,CreatePen,GetPenByID,ListPens,UpdatePen,UpdatePenStatus方法的返回值models.Xxx或[]models.Xxx替换为dto.XxxResponse或[]dto.XxxResponse。 - 在服务层内部将
repository返回的models对象转换为dto.XxxResponse。 - 将控制器中处理服务层特定业务错误(如
service.ErrHouseNotFound)的逻辑移入服务层,服务层应返回更抽象的错误或直接返回 DTO。
- 将
- 2.3.2 修改
internal/app/controller/management/pig_farm_controller.go:- 移除控制器中手动将领域实体转换为 DTO 的逻辑。
- 移除控制器中直接处理服务层特定业务错误类型的逻辑。
- 调整服务层方法的调用,使其直接处理服务层返回的
dto.XxxResponse。
2.4 plan 模块
- 2.4.1 创建并修改
internal/app/service/plan_service.go:- 定义
PlanService接口,包含CreatePlan,GetPlanByID,ListPlans,UpdatePlan,DeletePlan,StartPlan,StopPlan等方法。 - 为
CreatePlan,UpdatePlan方法定义并接收 DTO 作为输入。 - 将
GetPlanByID,ListPlans方法的返回值models.Plan或[]models.Plan替换为dto.PlanResponse或[]dto.PlanResponse。 - 调整
ListPlans方法的opts repository.ListPlansOptions参数替换为服务层自定义的查询 DTO 或一系列基本参数。 - 调整
DeletePlan,StartPlan,StopPlan方法,使其接收 DTO 或基本参数,并封装所有业务逻辑。 - 实现
PlanService接口。 - 在服务层内部将输入 DTO 转换为
models对象。 - 在服务层内部将
repository返回的models对象转换为dto.XxxResponse。 - 将
internal/app/controller/plan/plan_controller.go中所有的业务规则判断(计划类型检查、状态检查、执行计数器重置、ContentType 自动判断)移入服务层。 - 将
internal/app/controller/plan/plan_controller.go中对repository方法的直接调用移入服务层。 - 将
internal/app/controller/plan/plan_controller.go中对analysisPlanTaskManager的协调移入服务层。 - 将
internal/app/controller/plan/plan_controller.go中处理仓库层特有错误(gorm.ErrRecordNotFound)的逻辑移入服务层。
- 定义
- 2.4.2 修改
internal/app/controller/plan/plan_controller.go:- 引入并使用新创建的
plan_service。 - 移除控制器中直接创建
models.Plan对象和repository.ListPlansOptions的逻辑。 - 移除控制器中所有的业务规则判断。
- 移除控制器中直接调用
repository方法的逻辑。 - 移除控制器中直接协调
analysisPlanTaskManager的逻辑。 - 移除控制器中直接处理仓库层特有错误的逻辑。
- 调整服务层方法的调用,使其接收新的服务层输入 DTO 或基本参数,并直接处理服务层返回的
dto.XxxResponse。
- 引入并使用新创建的
- 2.4.3 修改
internal/core/component_initializers.go:创建并提供新的PlanService。 - 2.4.4 修改
internal/app/api/api.go:更新PlanController的依赖注入。
2.5 user 模块
- 2.5.1 创建并修改
internal/app/service/user_service.go:- 定义
UserService接口,包含CreateUser,Login,SendTestNotification等方法。 - 为
CreateUser,Login方法定义并接收 DTO 作为输入。 - 将
CreateUser,Login方法的返回值models.User替换为dto.CreateUserResponse或dto.LoginResponse。 - 调整
SendTestNotification方法,使其接收 DTO 或基本参数,并封装所有业务逻辑。 - 实现
UserService接口。 - 在服务层内部将输入 DTO 转换为
models对象。 - 在服务层内部将
repository返回的models对象转换为dto.XxxResponse。 - 将
CreateUser中处理用户名重复的业务逻辑从控制器移入服务层。 - 将
Login中进行密码验证的业务逻辑和协调tokenService的逻辑从控制器移入服务层。 - 将
SendTestNotification中调用domain_notify.Service的逻辑移入服务层。 - 将控制器中通过检查底层(仓库层或服务层)的特定错误类型或错误信息来执行业务判断的逻辑移入服务层。
- 定义
- 2.5.2 修改
internal/app/controller/user/user_controller.go:- 引入并使用新创建的
user_service。 - 移除控制器中直接创建
models.User对象的逻辑。 - 移除控制器中处理用户名重复的业务逻辑。
- 移除控制器中进行密码验证的业务逻辑和协调
tokenService的逻辑。 - 移除控制器中通过检查底层(仓库层或服务层)的特定错误类型或错误信息来执行业务判断的逻辑。
- 调整服务层方法的调用,使其接收新的服务层输入 DTO 或基本参数,并直接处理服务层返回的
dto.XxxResponse。
- 引入并使用新创建的
- 2.5.2 修改
internal/core/component_initializers.go:创建并提供新的UserService。 - 2.5.3 修改
internal/app/api/api.go:更新UserController的依赖注入。
3. 验证与测试
- 3.1 运行所有单元测试和集成测试,确保重构没有引入新的问题。
- 3.2 针对受影响的 API 接口进行手动测试,验证功能是否正常。
- 3.3 确保日志输出和审计记录仍然准确无误.