Clean Architecture(整洁架构)中通用事件上报模块应放在哪一层?
事件上报通用模块落地方案
最佳放置位置
该事件上报模块属于无业务耦合的全局基础能力组件,应当放在项目最内层的 core/common 公共基础层,所有上层架构分层、业务模块都可以依赖该层,不会出现循环依赖问题。对应的两个上报服务DataSource实现也可以同步放在core层的datasource子目录下统一管理。
如果把模块放在任意业务架构层(比如仅放在Repository层),会导致更内层的DataSource层无法反向依赖,出现调用限制或循环依赖问题。
各层级引用规则
首先需要对上报能力做抽象解耦,先抽离公共接口放在core层的API目录下,所有上层仅依赖接口,不直接依赖实现类,通过依赖注入容器完成实现绑定:
// core层公共接口 interface IEventReportRepository { suspend fun sendEvent(evt: String, args: Map<String,String>) } // 原实现类改为实现公共接口 class EventReportRepository @Inject constructor( private val logServiceADataSource, private val logServiceBDataSource ) : IEventReportRepository { override suspend fun sendEvent(evt: String, args: Map<String,String>) { // 原有上报逻辑 } }
各层级引用规则如下:
- DataSource层:依赖
IEventReportRepository接口,通过构造注入实例,用于上报数据读写异常、第三方接口请求结果、底层数据埋点等事件 - Repository层:依赖
IEventReportRepository接口,通过构造注入实例,用于上报数据聚合异常、多数据源调用流程节点等事件 - Domain层(用例层):依赖
IEventReportRepository接口,通过构造注入实例,用于上报业务规则触发、核心业务流程节点、业务逻辑异常等事件 - ViewModel/Presenter层:依赖
IEventReportRepository接口,通过构造注入实例,用于上报页面生命周期、用户交互行为、页面渲染异常等事件
注意事项
若项目未拆分单独的core/common基础层,可将公共接口放在项目最内层的公共声明模块,实现类放在第三方服务依赖模块,只要保证所有上层都可以依赖到公共接口即可。
内容的提问来源于stack exchange,提问作者Kennir
相关产品推荐
相关产品推荐

