You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

整洁架构下不同Domain间如何实现HomePage与FavoritePage快捷方式交互?

问题描述

我的应用包含两个功能模块(HomePage、FavoritePage),模块结构如下:

- HomePage
  - domain
  - data
  - presentation
- FavoritePage
  - domain
  - data
  - presentation

首页可添加FavoritePage快捷方式,FavoritePage上有一个按钮会根据快捷方式是否已添加显示不同图标。

在整洁架构中,不同Domain之间不允许直接通信,那么该如何在HomePage中访问和设置快捷方式?

解决方案

在整洁架构的约束下,解决跨模块状态共享(快捷方式状态)的核心是通过抽象契约解耦,避免模块Domain层直接依赖,具体可按以下两种方案落地:

1. 抽离独立的共享Domain模块

把「快捷方式管理」这个跨模块的核心逻辑,从Home和Favorite的Domain中抽出来,单独做成一个独立的共享模块,结构如下:

- Shared
  - domain
    - entities
      - Shortcut.kt // 定义快捷方式实体
    - usecases
      - AddShortcutUseCase.kt
      - CheckShortcutExistsUseCase.kt
      - RemoveShortcutUseCase.kt
    - repositories
      - ShortcutRepository.kt // 定义快捷方式操作的抽象契约
  - data
    - repositories
      - LocalShortcutRepositoryImpl.kt // 基于本地存储(如SharedPreferences、Room)实现契约

两个业务模块只需依赖这个共享Domain的抽象:

  • HomePage的Domain/Presentation层,通过调用AddShortcutUseCase完成快捷方式添加操作
  • FavoritePage的Domain/Presentation层,通过调用CheckShortcutExistsUseCase查询状态,进而控制按钮图标显示

这种方式完全符合整洁架构的依赖规则:所有模块都依赖抽象的Domain层,而非具体实现,彻底避免了模块间的直接耦合。

2. 基于全局状态契约的解耦方案

如果不想单独抽离模块,也可以通过定义全局状态契约+状态容器的方式实现解耦:

  • 在公共契约层(比如Shared模块的interfaces包)定义ShortcutState接口,包含isFavoriteShortcutAdded()、setFavoriteShortcutAdded(boolean)两个核心方法
  • 实现一个全局状态容器(比如基于Flow、LiveData的单例容器),实现上述接口,负责存储快捷方式的状态
  • HomePage和FavoritePage的Domain层,均依赖这个公共的ShortcutState接口,而非对方的Domain层:
    • Home的UseCase调用setFavoriteShortcutAdded(true)完成快捷方式添加
    • Favorite的UseCase调用isFavoriteShortcutAdded()获取状态,驱动UI更新

这种方式的核心是依赖抽象而非具体模块,同样满足整洁架构中Domain层不直接通信的约束,同时实现了跨模块状态共享。

关键注意点

  • 无论采用哪种方案,都要保证Domain层只依赖抽象,不依赖具体实现,比如ShortcutRepository的具体实现放在Data层,Domain层仅持有抽象接口
  • 所有状态的读写必须通过Domain层的UseCase完成,禁止在Presentation层直接操作状态,符合整洁架构的分层职责
  • 状态存储的具体细节(如用SharedPreferences还是Room)要封装在Data层,Domain层无需关心存储实现

内容的提问来源于stack exchange,提问作者Kennir

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 17:42:48