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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 05:06:04