整洁架构下不同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更新
- Home的UseCase调用
这种方式的核心是依赖抽象而非具体模块,同样满足整洁架构中Domain层不直接通信的约束,同时实现了跨模块状态共享。
关键注意点
- 无论采用哪种方案,都要保证Domain层只依赖抽象,不依赖具体实现,比如ShortcutRepository的具体实现放在Data层,Domain层仅持有抽象接口
- 所有状态的读写必须通过Domain层的UseCase完成,禁止在Presentation层直接操作状态,符合整洁架构的分层职责
- 状态存储的具体细节(如用SharedPreferences还是Room)要封装在Data层,Domain层无需关心存储实现
内容的提问来源于stack exchange,提问作者Kennir
相关产品推荐
相关产品推荐

