83 lines
4.0 KiB
Markdown
83 lines
4.0 KiB
Markdown
### 重构任务清单:纯 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)`
|