После использования ViewModels в MVC мне было интересно, практично ли применять то же самое к шаблону MVP. У меня есть только несколько соображений, одно из которых заключается в том, что MVP уже довольно сложно реализовать (со всем дополнительным кодом, не так уж много из-за кажущейся сложности) или что ViewModels уже имеют немного похожий способ моделирования данных или сущностей. Будет ли добавление еще одного уровня в виде ViewModels излишним или это логическая абстракция, которой я, как тот, кто реализует шаблон MVP, должен придерживаться?
Подходят ли ViewModels к шаблону Model View Presenter?
Ответы (2)
ViewModels могут быть очень полезны в MVP, и я думаю, что они принесут больше пользы, чем затраты на дополнительное кодирование.
Я думаю, что главное правило — использовать их там, где они вам нужны, а не просто добавлять новые шаблоны или архитектуру ради них самих.
Я работаю над общедоступным веб-приложением asp.net приличного размера, но следующее относится и к MVP в WinForms. Ниже приведены причины, по которым я решил использовать виртуальную машину в MVP.
Сайт собирает данные из множества веб-служб LOB. Услуги поддерживаются различными группами разработчиков в разных бизнес-вертикалях. Данные возвращаются повсюду с точки зрения:
- Type Soup — хранение GUID в виде строк, возврат двойных чисел вместо десятичных, даты в виде строк и т. д.
- Сумасшедшие соглашения об именах - свойства Camel case, символы подчеркивания в именах, путаница аббревиатур
Но главная причина, по которой я решил использовать его, заключалась в том, что предоставленная модель была такой же, как и в MVC: модели просто не соответствовали форме представлений. Мы объединяем классы моделей и добавляем дополнительные поля для расчетов или агрегированных значений и т. д.
Что касается изменений, которые мы сделали, мы должны были:
- Создайте новую папку ViewModels рядом с папкой Views and Presenters (Controllers).
- Сопоставьте значения модели с моделью представления
- Измените свойство в интерфейсе представления с типа модели на тип модели представления.
- Реализовать представление в соответствии с новым объектом
Единственная трудоемкая часть — это, естественно, сопоставление модели (моделей) с моделью представления. В нашем случае мы вынуждены выполнять приличный объем обработки в наших презентаторах, чтобы получить нужные нам данные, поэтому назначение свойств не представляет большой сложности. Для более простых потребностей что-то вроде AutoMapper устранило бы эту боль для сопоставлений.
Нашел реализацию MVPVM, похожую на то, что я хотел делать. (Однако я обнаружил, что это очень сложно, когда я его реализовал. Много повторяющейся работы. Вероятно, будет лучше с инструментом генерации кода)