Я правильно реализую модель пользовательского интерфейса модели MVP / презентации?
-
26-09-2019 - |
Вопрос
Я перерабатываю приложение 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.