[[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 层 - 没有显式的领域事件发布机制