Координация триад MVP

Допустим, у вас есть несколько триад MVP в вашем приложении (приложение WinForms .NET 2.0), и каждая триада отвечает за одну область ответственности. Как вы предпочитаете координировать общение между триадами MVP?

Вариант 1 Объект-координатор, который «имеет» каждую модель и следит за координацией, подписываясь на необходимые события в каждой, а затем решая, какие методы модели вызывать в каких сценариях.

Беспокоитесь, что это может быть класс «бога».

Вариант 2 У докладчика "есть" другой докладчик, и когда в модели происходит что-то интересное, ведущий использует другого докладчика для продолжения общения.

Беспокойство, что у докладчиков не должно быть открытого интерфейса (подход Presenter-first), и это нарушает это.

Мне просто интересно, что сделали другие люди для решения этой проблемы масштабируемым объектно-ориентированным способом. Что, если я добавлю еще одну триаду MVP? Насколько сложно будет вписать это в моего координатора? Должны быть хорошие примеры того, как управлять несколькими триадами MVP в приложении WinForms?


person Peter Kelly    schedule 22.11.2010    source источник


Ответы (1)


Не буду расплывчатым ... но это зависит от обстоятельств. Два подхода, которые я использовал в прошлом:

  1. Используйте шаблон агрегатор событий, чтобы отдельные докладчики отключили события, которые могут обрабатывать другие докладчики. например PresenterA выполняет: events.Raise<MyEvent> (), а PresenterB реализует: IHandler<MyEvent> и соответствующим образом реагирует в своем public void Handle (MyEvent @event) методе.
  2. Используйте общую модель, которую вводят докладчикам, которых необходимо координировать. Например, если один докладчик обрабатывает выделение данного Foo, а другой докладчик должен обновить панель сведений с помощью сведений о Foo, я мог бы использовать модель состояния IFooSelection и внедрить ее в обоих докладчиков, которым необходимо согласовать концепцию `` текущий выбор ''. '.

Интерфейс:

public interface IFooSelection {
    public event EventHandler Changed;
    Foo Selected { get; set; }
}
person Pete    schedule 22.11.2010