Я правильно реализую модель пользовательского интерфейса модели MVP / презентации?

StackOverflow https://stackoverflow.com/questions/3435834

Вопрос

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


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

   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.

  • Вид реагирует на это изменение путем закрытия сама.

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

Это было полезно?

Решение

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

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

Другие советы

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top