6.6 KiB
6.6 KiB
重构任务清单:纯 Context 驱动的调用链追踪
1. 核心改造 (logs 包)
internal/infra/logs/logs.go:- 实现
AddCompName,AddFuncName,GetLogger,Trace四个核心包级函数。 - 移除旧
Logger结构体中的状态字段(如component)。
- 实现
2. 依赖注入与结构体改造
-
internal/core/application.go:- 移除
Application结构体中的Logger *logs.Logger成员。 - 修改
NewApplication函数,使其不再创建logger,而是创建根context.Background()。 - 调整
NewApplication,将根context传递给initInfrastructure,initDomainServices,initAppServices和api.NewAPI。 - 移除
Application结构体中所有对app.Logger的直接调用,改为通过context获取Logger。
- 移除
-
internal/core/component_initializers.go:- 修改所有组件结构体定义: 遍历所有相关组件(Controllers, Services, Repositories 等),将其结构体中的
logger *logs.Logger成员变量替换为selfCtx context.Context。 - 重构所有
init...函数:- 移除所有
logger *logs.Logger参数,改为接收ctx context.Context。 - 在每个
init...函数内部,为即将创建的组件生成其专属的selfCtx。例如:selfCtx := logs.AddCompName(ctx, "ComponentName")。 - 将这个
selfCtx注入到组件的构造函数中,并由组件保存为selfCtx成员。
- 移除所有
- 修改所有组件结构体定义: 遍历所有相关组件(Controllers, Services, Repositories 等),将其结构体中的
3. 全局方法签名改造:传递 context.Context
以下所有列出的组件,其所有公共方法都需要进行签名改造,将 ctx context.Context 作为第一个参数。
3.1. API 层
-
internal/app/api/api.go(API):- 修改
NewAPI函数,移除logger参数,改为接收ctx context.Context。 - 移除
API结构体中的logger成员,改为保存selfCtx context.Context。 - 为
API组件本身创建selfCtx:selfCtx := logs.AddCompName(ctx, "API"),并传递给所有Controller的构造函数。
- 修改
-
internal/app/controller/user/user_controller.go(user.Controller) -
internal/app/controller/device/device_controller.go(device.Controller) -
internal/app/controller/plan/plan_controller.go(plan.Controller) -
internal/app/controller/management/pig_farm_controller.go(management.PigFarmController) -
internal/app/controller/management/pig_batch_controller.go(management.PigBatchController) -
internal/app/controller/monitor/monitor_controller.go(monitor.Controller)- 改造动作:
- 修改
NewController函数,移除logger参数,改为接收selfCtx context.Context。 - 移除
Controller结构体中的logger成员,改为保存selfCtx。 - 所有公共方法: 接收
echo.Context的方法,需要从中提取request.Context()作为upstreamCtx。
- 修改
- 改造动作:
-
internal/app/middleware/auth.go -
internal/app/middleware/audit.go- 改造动作:
- 检查并重构所有日志记录中间件。
- 中间件应该从请求的
c.Request().Context()中提取upstreamCtx。 - 使用
logs.Trace或logs.AddFuncName创建新的Context和Logger。 - 关键: 使用
c.SetRequest(c.Request().WithContext(newCtx))将更新后的Context写回echo.Context,以便传递给后续的中间件和Controller。
- 改造动作:
3.2. 应用层 (Application Services)
internal/app/service/pig_farm_service.go(service.PigFarmService)internal/app/service/pig_batch_service.go(service.PigBatchService)internal/app/service/monitor_service.go(service.MonitorService)internal/app/service/device_service.go(service.DeviceService)internal/app/service/plan_service.go(service.PlanService)internal/app/service/user_service.go(service.UserService)
3.3. 领域层 (Domain Services)
internal/domain/audit/service.go(audit.Service)internal/domain/device/general_device_service.go(device.Service)internal/domain/notify/notify.go(domain_notify.Service-failoverService实现)internal/domain/pig/pen_transfer_manager.go(pig.PigPenTransferManager)internal/domain/pig/pig_trade_manager.go(pig.PigTradeManager)internal/domain/pig/pig_sick_manager.go(pig.SickPigManager)internal/domain/pig/pig_batch_service.go(pig.PigBatchService)internal/domain/plan/analysis_plan_task_manager.go(plan.AnalysisPlanTaskManager)internal/domain/plan/plan_execution_manager.go(plan.ExecutionManager)internal/domain/plan/plan_service.go(plan.Service)internal/domain/task/task.go(task.TaskFactory)
3.4. 基础设施层 (Infrastructure)
internal/infra/database/storage.go(database.Storage)internal/infra/logs/logs.go(logs.Logger- 内部实现,非注入)internal/infra/notify/log_notifier.go(notify.LogNotifier)internal/infra/repository/unit_of_work.go(repository.UnitOfWork-gormUnitOfWork实现)internal/infra/transport/lora/chirp_stack.go(lora.ChirpStackTransport)internal/infra/transport/lora/lora_mesh_uart_passthrough_transport.go(lora.LoRaMeshUartPassthroughTransport)internal/infra/transport/lora/placeholder_transport.go(lora.PlaceholderTransport)internal/app/webhook/chirp_stack.go(webhook.ChirpStackListener)internal/app/webhook/placeholder_listener.go(webhook.PlaceholderListener)
4. 日志调用点及方法内部逻辑改造
- 遍历所有业务方法 (针对上述所有列出的组件的公共方法):
- 定位旧日志: 搜索所有对旧
z.logger.*成员的调用。 - 改造方法入口 (对于非 Controller 方法):
- 在方法开始处,使用作为参数传入的
ctx(作为upstreamCtx) 和组件自身持有的z.selfCtx,调用logs.Trace。newCtx, logger := logs.Trace(ctx, z.selfCtx, "MethodName")
- 将所有旧的
z.logger.*(...)调用,替换为使用新获取的logger.*(...)。
- 在方法开始处,使用作为参数传入的
- 改造下游调用:
- 在方法内部,当需要调用其他组件的方法时(如下游服务),必须传递
newCtx。err := z.downstreamService.DoSomething(newCtx, data)
- 在方法内部,当需要调用其他组件的方法时(如下游服务),必须传递
- 定位旧日志: 搜索所有对旧