feat: 添加事件驱动规则和生成结构说明
This commit is contained in:
@@ -222,6 +222,29 @@ In this case:
|
|||||||
|
|
||||||
- 在业务结构体中注入 `*job.Job`(见 `backend/providers/job`),然后调用 `obj.job.Add(jobs.XXXJob{...})` 入队。
|
- 在业务结构体中注入 `*job.Job`(见 `backend/providers/job`),然后调用 `obj.job.Add(jobs.XXXJob{...})` 入队。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Events(Watermill)
|
||||||
|
|
||||||
|
本项目使用 `ThreeDotsLabs/watermill` 做事件驱动,并通过框架封装在 `backend/providers/event/` 中(支持 `Go`/`Kafka`/`Redis`/`Sql` 等 channel)。
|
||||||
|
|
||||||
|
- MUST:事件发布(调用 `PubSub.Publish(...)` 等)只能在 `service` / `controller` / `event` 层编写;其它位置(例如 `middlewares` / `database` / `models` / `providers` 等)禁止发布事件,避免耦合与隐式副作用。
|
||||||
|
- MUST:事件订阅处理(subscriber handler)保持“薄”:只做反序列化/幂等与边界校验 → 调用 `services.*` 完成业务。
|
||||||
|
|
||||||
|
### 生成与结构
|
||||||
|
|
||||||
|
- 新增事件:`atomctl new event <Name>`
|
||||||
|
- 会在 `backend/app/events/topics.go` 中新增 topic 常量(形如 `event:<snake_case>`)。
|
||||||
|
- 会生成:
|
||||||
|
- `backend/app/events/publishers/<snake_case>.go`(publisher:实现 `contracts.EventPublisher`,负责 `Marshal()` + `Topic()`)
|
||||||
|
- `backend/app/events/subscribers/<snake_case>.go`(subscriber:实现 `contracts.EventHandler`,负责 `Topic()` + `Handler(...)`)
|
||||||
|
- 生成后:按项目约定运行一次 `atomctl gen provider`(用于刷新 DI/provider 生成文件)。
|
||||||
|
|
||||||
|
### Topic 约定
|
||||||
|
|
||||||
|
- 统一在 `backend/app/events/topics.go` 维护 topic 常量,避免散落在各处形成“字符串协议”。
|
||||||
|
- topic 字符串建议使用稳定前缀(例如 `event:`),并使用 `snake_case` 命名。
|
||||||
|
|
||||||
### 2.2 Enum strategy
|
### 2.2 Enum strategy
|
||||||
|
|
||||||
- DO NOT use native DB ENUM.
|
- DO NOT use native DB ENUM.
|
||||||
|
|||||||
Reference in New Issue
Block a user