Модели, представления, модели представлений и презентаторы

#wpf #mvvm #mvp

#wpf #mvvm #mvp

Вопрос:

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

На данный момент у меня есть WPF View, который реализует интерфейс ICustomView. Этот интерфейс внедрен в мой презентатор. Затем презентатор отвечает за подписку на данные, управление подписками и т.д. Когда данные возвращаются презентатору, он вызывает различные методы для модели (IObservable collection of CustomBusinessObjects). Это делается с использованием интерфейса ICustomView, поскольку IObservable является свойством модели.

Проблема, которую я вижу в этом, заключается в том, что модель слишком связана с представлением. Также презентатор решает, какие методы вызывать для модели. На данный момент представление состоит из сетки WinForms, и она предоставляется ICustomView, позволяющей презентатору вызывать методы для представления. Однако это усиливает связь Presenter и View, что затрудняет замену этой сетки WinForms на сетку или диаграмму WPF и т. Д

Я рассматриваю возможность создания модели как полностью отдельной сущности, скажем, IModel с помощью одного метода ProcessUpdate (тема строки, полезная нагрузка iMessage). Это переместило бы логику из презентатора в модель. Это также означало бы, что более одного представления могут совместно использовать одну и ту же модель. Пользовательская модель могла бы иметь дополнительные интерфейсы для конкретных настроек, но презентатору нужно было бы знать только об IModel.

Звучит ли это как разумная идея? Я что-то здесь упускаю?

Приветствуются любые советы.

Спасибо

Комментарии:

1. WPF или Silverlight = MVVM, ASP.NET = MVP или MVVM

Ответ №1:

Я бы рекомендовал переключиться с MVP на MVVM, потому что вы используете WPF. Я бы использовал MVP только в том случае, если бы вы использовали ASP.Net или WinForms.

При этом ваши объекты MVVM будут:

Модель: простой объект данных. Он не должен содержать никаких функциональных возможностей, таких как сохранение или редактирование, но может иметь логику проверки.

Вид: Ваш пользовательский интерфейс. Обычно я делаю свой в виде DataTemplate для типа класса ViewModel. Он должен быть привязан к свойствам и командам вашей ViewModel.

ViewModel: элемент, объединяющий эти два. Любые данные, отображаемые в представлении, должны быть привязаны к свойству в ViewModel. Любые команды в вашем представлении, такие как нажатия кнопок, также должны указывать на методы в ViewModel.

Например, когда пользователь нажимает кнопку GetCustomer в представлении, ViewModel должна получить команду, перейти и получить CustomerModel и предоставить его свойства для привязки к представлению. Когда пользователь нажимает Сохранить, ViewModel должна подтвердить, что модель допустима, а затем выполнить код сохранения, используя свое свойство CustomerModel.

Ответ №2:

Лично я предпочитаю при использовании WPF использовать сетку данных WPF и привязывать ее к datacontext в шаблоне MVVM. Я думаю, что первое, от чего вам нужно избавиться, это от сетки WinForms (будет практически невозможно отделить вашу модель / представление, пока вы используете сетку WinForms.

Я бы провел исследование по нескольким разным вещам.

  • Шаблон MVVM
  • WPF DataGrid
  • Привязка DataGrid к DataContext

Как только вы дойдете до этого момента, все, что вам нужно будет сделать, это обновить ваш datacontext, и ваше представление обновится вместе с ним.