Подтвердить что ты не робот

Связь MVP между ведущими?

У меня вопрос о том, как обрабатывать связь между ведущими при использовании MVP. Скажем, у меня две MVP-триады. Один из них - это список продуктов (Triad A), а другой - общая информация о выбранном продукте (Triad B).

Как сообщить Presenter B, что он должен обновляться, потому что выбранный продукт изменился на A? Я, конечно, могу подумать о том, как это сделать, но мне было интересно, существует ли общее соглашение о том, как справиться с этим.

Заранее благодарим за любые идеи!

4b9b3361

Ответ 1

Сам шаблон не определяет, как справиться с этим.

Мое собственное предпочтение - это центр сообщений/событий, где ведущие могут регистрировать интерес к определенным событиям. Он предотвращает появление сложных деревьев зависимостей и позволяет тестировщикам справляться.

Например:

class PresenterA
{
   void HandleProductSelectionChanged(int productId)
   {
      EventHub.Publish(EventType.ProductChanged, productId);
   }
}

class PresenterB
{
    void PresenterB
    {
       EventHub.Register(EventType.ProductChanged, HandleProductChanged);
    }

    public void HandleProductChanged(object state)
    {
       var productId = (int)state;
       var productDetails = LoadProductDetails(productId);
       view.DisplayProductDetails(productDetails);
    }
}

EventHub будет хранить список подписчиков для вызова для каждого типа события.

Вы сохраняете свою тестируемость - просто вызовите HandleProductChanged, чтобы увидеть, как PresenterB будет отвечать на новый выбор продукта.

Единственным недостатком (как и для любого шаблона) является введение уровня косвенности. Если PresenterA напрямую вызвал PresenterB или PresenterB прослушал событие на PresenterA, сразу же стало очевидно, что произойдет.

В этом подходе у вас будет дополнительный шаг, видя EventType.ProductChanged, а затем найдя, какие докладчики зарегистрировали интерес к этому событию.

По моему собственному опыту, этот единственный уровень косвенности заслуживает модульности, которую вы получаете.

Ответ 2

Лично я не согласен с тем, как многие люди выбирают шину событий для решения таких проблем.

Мне трудно представить себе случай, когда двум ведущим нужно общаться друг с другом, можете ли вы представить реальный случай?

На мой взгляд, если двум ведущим нужно общаться друг с другом, вы должны объединить эти два только в одном ведущем. Помните, что связь объекта моделей между двумя вариантами использования - это бизнес-логика, поэтому, возможно, объем презентатора больше, чем вы думали изначально.

Считайте также, что если вы правильно используете коллаборационистов, вам не нужна связь между ведущими. Данные должны предоставляться сотрудниками.