### 重构任务清单:纯 Context 驱动的调用链追踪 --- #### 1. 核心改造 (`logs` 包) - **`internal/infra/logs/logs.go` (`logs.Logger` - 内部实现,非注入)** - **核心包级函数实现 (根据 `implementation.md` 描述)**: - [x] 实现 `AddCompName(ctx context.Context, compName string) context.Context`。 - [x] 实现 `AddFuncName(upstreamCtx context.Context, selfCtx context.Context, funcName string) context.Context`。 - [x] 实现 `GetLogger(ctx context.Context) *Logger`。 - [x] 实现 `Trace(upstreamCtx context.Context, selfCtx context.Context, funcName string) (context.Context, *Logger)`。 - **`Logger` 结构体改造**: - [x] 无 - **`GormLogger` 改造**: - [x] 修改 `GormLogger.Info` 方法,从传入的 `ctx` 中获取 `logger` 实例,并使用该实例进行日志记录。 - [x] 修改 `GormLogger.Warn` 方法,从传入的 `ctx` 中获取 `logger` 实例,并使用该实例进行日志记录。 - [x] 修改 `GormLogger.Error` 方法,从传入的 `ctx` 中获取 `logger` 实例,并使用该实例进行日志记录。 - [x] 修改 `GormLogger.Trace` 方法,从传入的 `ctx` 中获取 `logger` 实例,并使用该实例进行日志记录。特别是 `With(fields...)` 的调用需要调整。 --- #### 2. 依赖注入与结构体改造 - **`internal/core/application.go`**: - [x] 移除 `Application` 结构体中的 `Logger *logs.Logger` 成员。 - [x] 修改 `NewApplication` 函数,使其不再创建 `logger`,而是创建根 `context.Background()`。 - [x] 调整 `NewApplication`,将根 `context` 传递给 `initInfrastructure`, `initDomainServices`, `initAppServices` 和 `api.NewAPI`。 - [x] 移除 `Application` 结构体中所有对 `app.Logger` 的直接调用,改为通过 `context` 获取 `Logger`。 - **`internal/core/component_initializers.go`**: - [x] **修改所有组件结构体定义**: 遍历所有相关组件(Controllers, Services, Repositories 等),将其结构体中的 `logger *logs.Logger` 成员变量替换为 `selfCtx context.Context`。 - [x] **重构所有 `init...` 函数**: - 移除所有 `logger *logs.Logger` 参数,改为接收 `ctx context.Context`。 - 在每个 `init...` 函数内部,为即将创建的组件生成其专属的 `selfCtx`。例如: `selfCtx := logs.AddCompName(ctx, 'ComponentName')`。 - 将这个 `selfCtx` 注入到组件的构造函数中,并由组件保存为 `selfCtx` 成员。 --- #### 3. 全局方法签名改造:传递 `context.Context` **以下所有列出的组件,其所有公共方法都需要进行签名改造,将 `ctx context.Context` 作为第一个参数。** ##### 3.1. API 层 [api](./task-api.md) [controller](./task-controller.md) [middleware](./task-middleware.md) [webhook](./task-webhook.md) ##### 3.2. 应用层 (Application Services) [service](./task-service.md) ##### 3.3. 领域层 (Domain Services) [domain](./task-domain.md) ##### 3.4. 基础设施层 (Infrastructure) [repository](./task-repository.md) [infra-other](./task-infra.md) --- #### 4. 日志调用点及方法内部逻辑改造 - [ ] **遍历所有业务方法** (针对上述所有列出的组件的公共方法): - [ ] **定位旧日志**: 搜索所有对旧 `z.logger.*` 成员的调用。 - [ ] **改造方法入口** (对于非 Controller 方法): 1. 在方法开始处,使用作为参数传入的 `ctx` (作为 `upstreamCtx`) 和组件自身持有的 `z.selfCtx`,调用 `logs.Trace`。 - `newCtx, logger := logs.Trace(ctx, z.selfCtx, 'MethodName')` 2. 将所有旧的 `z.logger.*(...)` 调用,替换为使用新获取的 `logger.*(...)`。 - [ ] **改造下游调用**: 1. 在方法内部,当需要调用其他组件的方法时(如下游服务),**必须传递 `newCtx`**。 - `err := z.downstreamService.DoSomething(newCtx, data)`