4.0 KiB
4.0 KiB
重构任务清单:纯 Context 驱动的调用链追踪
1. 核心改造 (logs 包)
internal/infra/logs/logs.go(logs.Logger- 内部实现,非注入)- 核心包级函数实现 (根据
implementation.md描述):- 实现
AddCompName(ctx context.Context, compName string) context.Context。 - 实现
AddFuncName(upstreamCtx context.Context, selfCtx context.Context, funcName string) context.Context。 - 实现
GetLogger(ctx context.Context) *Logger。 - 实现
Trace(upstreamCtx context.Context, selfCtx context.Context, funcName string) (context.Context, *Logger)。
- 实现
Logger结构体改造:- 无
GormLogger改造:- 修改
GormLogger.Info方法,从传入的ctx中获取logger实例,并使用该实例进行日志记录。 - 修改
GormLogger.Warn方法,从传入的ctx中获取logger实例,并使用该实例进行日志记录。 - 修改
GormLogger.Error方法,从传入的ctx中获取logger实例,并使用该实例进行日志记录。 - 修改
GormLogger.Trace方法,从传入的ctx中获取logger实例,并使用该实例进行日志记录。特别是With(fields...)的调用需要调整。
- 修改
- 核心包级函数实现 (根据
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 层
api controller middleware webhook
3.2. 应用层 (Application Services)
3.3. 领域层 (Domain Services)
3.4. 基础设施层 (Infrastructure)
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)
- 在方法内部,当需要调用其他组件的方法时(如下游服务),必须传递
- 定位旧日志: 搜索所有对旧