Какой самый лучший подход для связи между модулями в чистой архитектуре - PullRequest
1 голос
/ 29 октября 2019

Я работаю на сайте электронной коммерции. Я следую чистой архитектуре с MVVM и Dagger 2. Но я застреваю, когда нам нужно общаться между модулями, значит, мне нужно вызывать некоторые методы и классы из одного модуля в другой. Фактический сценарий: существует один отдельный модуль для корзины и другой для категорий (состоящий из продуктов на основе категорий)
У меня есть некоторый набор API в модуле корзины (например, addToCart, выборка cartList, удаление элемента корзины и т. Д.), Которыйнеобходимо вызывать как в модуле корзины, так и в модуле категорий (API addToCart необходимо вызывать из модуля категорий). Один из способов сделать это - снова написать один и тот же код в обоих модулях, что увеличит дополнительные усилия, а также сделает оба модуля зависимыми, что нарушит подход чистой архитектуры.

Может кто-нибудь предложить мне лучший подход для этого в чистой архитектуре.

1 Ответ

0 голосов
/ 29 октября 2019

Вы можете создать новый модуль с общим кодом и добавить его в качестве зависимости в оба модуля (корзину и категории), если у вас есть модульная структура по слоям, вы можете сделать то же самое для слоев данных, поэтому, если вам нужны те же 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
  }
}
...