干净的架构:哪一层是一个非常常见的模块?

Clean architecture: which layer for a very common module?

我有一个非常常用的模块,用于向 multi-platform/service 报告事件,它看起来像

class EventReportRepository @Inject constructor(
  private val logServiceADataSource,
  private val logServiceBDataSource
) {
 
  suspend fun sendEvent(evt: String, args: Map<String,String>)
}

很多层都可能调用这个模块,比如DataSource、Repository、Domain、ViewMode、Presenter。

我的问题是,这个模块的最佳位置在哪里?如何为其他层引用它?

如果从多个层调用一个模块,将它放在单独的“core”文件夹中是有意义的

|--> lib/
      |--> core/
      |       |--> utility/
      |       |      |--> common_module_a/
      |       |      |--> common_module_b/
      |       |      |...
      |       |--> ...
      |--> features/
      |       |--> feature_a/
      |       |      |--> data_source/
      |       |      |--> repository/
      |       |      |--> domain/
      |       |      |--> view_mode/
      |       |      |--> presenter/
      |       |--> feature_b/
      |       |      |...

注意:我见过有人用上面的方式组织特征,而且层文件夹是顶级文件夹,包含每个层的特征子文件夹:

|...
|--> layers/
      |--> data_source/
      |       |--> feature_a/
      |       |--> feature_b/
      |--> repository/
      |       |--> feature_a/
      |       |--> feature_b/
      |--> ...

无论如何,与 features/layers 文件夹不同,我认为没有关于如何组织核心文件夹的硬性规定。这真的是视情况而定。它可能包含:

  • 在整个层中使用的模块(如您的示例)
  • 强制清洁架构的合同(抽象 repository/datasoruce 类 等)

这是这样一个组织的example