[[DDD]]
### 一、界限上下文 (Bounded Context)
| 上下文 | 职责 | 对应代码 |
| -------- | --------------- | -------------------- |
| 词汇管理 | 单词/词块的增删改查 | background.js 消息处理 |
| 页面高亮 | 识别生词、渲染标注 | content.js |
| 数据同步 | 本地↔服务器双向同步 | pullFromServer(), pushWordToServer() |
### 二、实体 (Entity)
UserVocab - 用户词汇条目
唯一标识: (user_id, word)
可变状态: status, is_deleted, updated_at
生命周期: 从添加到标记已知/删除
对应 schema.sql:5-15 的 user_vocab 表。
### 三、值对象 (Value Object)
| 值对象 | 特征 | 代码位置 |
| -------------- | --------------------------- | ------------ |
| VocabMeta | { updated_at } 不可变,用于冲突判断 | background.js:44 |
| PhraseDefinition | { word: "中文释义" } 无标识,可替换 | phrases.json |
### 四、聚合 (Aggregate) 与聚合根
```
┌─────────────────────────────────────────┐
│ 用户词库聚合 (UserVocabulary) │
│ 聚合根: User (session.user.id) │
│ ┌─────────────────────────────────┐ │
│ │ knownWords: Set<string> │ │
│ │ knownPhrases: Set<string> │ │
│ │ importedWords: Set<string> │ │
│ │ vocabMeta: { word: { updated_at } } │ │
│ └─────────────────────────────────┘ │
└─────────────────────────────────────────┘
```
所有词汇操作必须通过 User 这个聚合根,体现在 background.js:35 的 .eq('user_id', session.user.id)。
### 五、领域事件 (Domain Event)
| 事件 | 触发时机 | 代码 |
| --------------- | ---------- | ----------------------------- |
| WordAdded | 用户点击生词 | addWord 消息 → pushWordToServer() |
| PhraseAdded | 用户点击词块 | addPhrase 消息 → pushPhraseToServer() |
| WordMarkedKnown | 标记已熟知 | markKnown → markWordAsKnown() |
| AuthStateChanged | 登录状态变化 | onAuthStateChange → pullFromServer() |
### 六、领域服务 (Domain Service)
同步冲突解决 (background.js:46-71):
// 基于时间戳的 Last-Write-Wins 策略
```
if (serverTime >= localTime) {
// 服务器更新 → 覆盖本地
}
```
词块匹配服务 (content.js 中的 findPhrases()):
- 最长匹配优先算法
- 纯领域逻辑,不依赖 UI
### 七、仓储 (Repository)
| 仓储 | 实现 | 职责 |
| ----------------- | ---------------------- | -------- |
| LocalVocabRepository | chrome.storage.local | 本地持久化 |
| RemoteVocabRepository | Supabase user_vocab 表 | 远程持久化 |
依赖倒置体现:领域层定义存储需求,基础设施层提供具体实现。
### 八、应用服务 (Application Service)
chrome.runtime.onMessage.addListener 充当应用层编排器:
// 协调领域操作 + 基础设施
```
if (request.action === 'addWord') {
// 1. 更新本地仓储 (chrome.storage)
// 2. 触发领域事件 (pushWordToServer)
// 3. 返回结果
}
```
### 九、当前架构的 DDD 视角评价
做得好的:
- Local-first 设计(领域逻辑不依赖网络)
- 聚合边界清晰(按 user_id 隔离)
- 值对象不可变(vocabMeta 只读)
可改进的:
- 目前偏向贫血模型(数据和行为分离)
- 领域逻辑散落在 background.js,可抽取为独立的 Domain 层
- 没有显式的领域事件发布机制