首页 > 解决方案 > 哪种是干净架构中模块之间通信的最佳方法

问题描述

我在一个电子商务网站上工作。我正在使用 MVVM 和 Dagger 2 遵循干净的架构。但是当我们需要在模块之间进行通信时,我遇到了困难,这意味着我必须从一个模块调用另一个模块的一些方法和类。实际情况是 - 有一个单独的购物车模块和另一个用于类别的模块(由基于类别的产品组成)
我在购物车模块中有一组 API(例如 addToCart、fetch cartList、remove cart item 等)需要在购物车模块和分类模块中调用(addToCart API 需要从分类模块调用)。一种方法是在两个模块中再次编写相同的代码,这将增加额外的工作量并使两个模块都依赖,这违反了干净的架构方法。

任何人都可以在干净的架构中建议我最好的方法。

标签: androidmvvmdagger-2modularclean-architecture

解决方案


您可以使用共享代码创建一个新模块并将其作为依赖项添加到两个模块(购物车和类别)中,如果您已按层模块化,您可以对数据层执行相同操作,因此如果您在另一个模块中需要相同的 API如果您只使用某些部分,可以将其添加为依赖项或将其拆分为新模块。

    implementation project(':common_apis_module')

在干净的架构中,如果您从模块发出请求,则将其理解为不同的用例,如果在两种情况下都需要从模型中获取相同的数据,则您可能还需要在公共模块中共享 UseCase。

在 common_apis_module 中为模块之间的通信创建接口。

    interface CommunicationModule1 {
    fun doSomethingInModule1(someParam: String)
    fun doAnotherThingInModule1(anotherParam: Int)
}

并在与上述相同的第二个模块中创建另一个用于通信的接口。然后您在两个模块中添加了该通用模块,您将能够在两个模块中使用接口。我建议使用匕首。

    class OneClassInModule2 : DaggerAppCompatActivity{

    @Inject
    late init var communicationModule1 : CommunicationModule1

}

二等:

class OneClassInModule1: CommunicationModule1 {
  override fun doSomethingInModule1(someParam: String){
    // Do Something with the string
  }
}

推荐阅读