Правильно ли я реализую шаблон пользовательского интерфейса MVP / Presentation Model? - PullRequest
2 голосов
/ 08 августа 2010

Я заново работаю с приложением Winforms и хотел бы использовать вариант шаблона Presentation Model для пользовательского интерфейса.Может ли кто-нибудь сказать мне из следующих объяснений, если я делаю это правильно?


Я решил настроить зависимости следующим образом:

   Model <---- Presentation Model <---- View

То есть:

  • Модель не знает ничего, кроме себя.

  • Модель представления имеет ссылку на модель (но не наоборот).

  • Представление имеет ссылку на модель презентации (но не наоборот).

Я использую привязку данных Winforms, чтобы сохранить представление и представлениемодель синхронизирована.

Теперь все это работает как брелок, за исключением случаев, когда мне нужно иметь дело, например, с нажатием на кнопку «Закрыть» формы.Поскольку модель представления не имеет ссылки на представление, она не может подписаться на любые события, опубликованные представлением.Таким образом, я придумал следующий костыль:

Presentation Model                   View
+--+                                 +--+
|  |                                 |  |
|  |                                 | <--------X closeButton.Click event fires
|  |                                 |  |
|  |                         +--------X |
|  |   CloseRequested = true |       |  | 
|  |                         +--------> |
|  |                                 |  |
|  | CloseRequested   CloseRequested |  |
| <-----------------------------------< |
|  |                                 |  |
| X--------+                         |  |
|  |       | IsClosed = true         |  |
| <--------+                         |  |
|  |                                 |  |
|  | IsClosed              MustClose |  |
| >-----------------------------------> |
|  |                                 |  |
|  |                                 | X--------> view.Close()
|  |                                 |  |
+--+                                 +--+

То есть:

  • Пользователь нажимает кнопку «Закрыть».

  • Событие Click кнопки фиксируется в представлении, которое реагирует, устанавливая свойство CloseRequested.

  • Привязка данных переносит это значение в соответствующее свойство вмодель презентации.

  • Модель презентации реагирует на это изменение, устанавливая ее свойство IsClosed.

  • Привязка данных переносит это значение вMustClose.

  • Представление реагирует на это изменение, закрывая себя.

Модель представления довольно хорошо отделена от представления,и наоборот это большая работа только для обработки одной кнопки .Есть ли более простой способ, учитывая график зависимости, который я выбрал?

Ответы [ 3 ]

2 голосов
/ 09 августа 2010

Я недавно преобразовывал приложение Windows Forms в архитектуру MVP, и похоже, что вы настроили свои зависимости аналогично тому, что я делал.Однако у меня просто есть интерфейс IPresenter, который определяет методы, позволяющие представлению передавать пользовательские запросы.Поскольку представление уже зависит от презентатора и ссылки на него, представляется разумным просто вызывать методы запроса непосредственно для него.

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

1 голос
/ 10 августа 2010

это только мое мнение.

Работа с моделью представления требует 100% поддержки пользовательского интерфейса для привязки данных. Даже WPF не делает действие CLOSE привязанным. Многое не будет работать гладко в модели презентации, такой как MessageBox Confirmation. даже его можно абстрагировать с помощью интерфейса Presenter, но он по-прежнему не очень приятен на вкус, а простота принесена в жертву.

с другой стороны, основными целями модели презентации является тестирование логики представления. В некоторых случаях, если ваше «Действие закрытия» должно быть проверено модулем из-за некоторой логики, прежде чем оно будет закрыто, тогда ваш код - единственный выбор. но если это всего лишь простое подтверждение «Вы уверены, что хотите выйти», то лучше поместить его в представление, а не в модель презентации, поскольку оно не требует модульного тестирования.

0 голосов
/ 09 августа 2010

Представление имеет ссылку на модель презентации (но не наоборот).

AFAIK презентация должна иметь ссылку для более точного просмотра интерфейса IView, чтобы презентация не изменяласьпара с конкретным видом.Затем в классе презентации вы можете вызвать методы просмотра и подписаться на просмотр событий через IView.

...