Подтвердить что ты не робот

Каковы преимущества и недостатки View-first vs. ViewModel - сначала в шаблоне MVVM

Я даю презентацию об использовании MVVM в реальных приложениях, и я включаю раздел о конструктивных решениях религиозных войн, связанных с использованием MVVM в качестве шаблона в вашем приложении. В приложении MVVM существуют два основных способа (которые я знаю) для создания новой пары View/ViewModel:

  • View-First, в котором вы создаете представление, и он создает свой собственный ViewModel и устанавливает его в свой DataContext.
  • ViewModel-First, в котором вы создаете новые модели представлений и создаете новые представления в ответ на изменения свойств ViewModel, обычно с помощью ItemsControls и/или DataTemplates.

В вашем опыте, каковы плюсы и минусы каждого метода? Что они разрешают и с какими проблемами сталкиваются каждый?

Сводка результатов


  • Просмотр первой - Плюсы
    • Легко отслеживать, какой ViewModel используется в представлении
  • Просмотр первой - Против
    • Не позволяет использовать один вид с несколькими ViewModels
    • Требуется дополнительное событие для обработки связи между Views и ViewModels.
  • ViewModel First - Профили
    • Позволяет более полное тестирование логики для открытия новых видов и ViewModels
    • Как правило, DRYer становится больше приложений
    • View и ViewModel более независимы и могут работать более легко.
  • ViewModel First - Против
    • Сложнее настроить в Silverlight без DataTemplateSelector и напечатать DataTemplates.
4b9b3361

Ответ 1

Учитывая функцию Data Templating в WPF, я считаю, что ViewModel-First - это способ, которым WPF был предназначен для.

Я уточню это утверждение: Data Templating позволяет никогда не создавать экземпляры из ViewModel. Если все сделано правильно, ваши Views и ViewModels могут храниться в отдельных проектах, которые НЕ связывают друг с другом. Кроме того, проект ViewModel не должен даже ссылаться на сборки PresentationFramework, что делает ваши ViewModels доступными для потребления любым мыслимым пользователем.

Ответ 2

Обычно я предпочитаю View-Model просто потому, что считаю, что лучше следовать правилу DRY. Когда вы начинаете создавать приложения с большим масштабом, я нахожу, что это упрощает тестирование, тем самым перевешивая начальный бит головной боли, который вам нужно решить при настройке приложения.

Ответ 3

Caveat - я использую WPF, а не Silverlight.

С помощью виртуальной машины, создающей экземпляр V (как я это делаю), представление является независимым и может использоваться независимо от VM (например, в дизайнере)

Лично я поворачиваюсь к MVVMC (модели, View, ViewModel, Controller), где у меня есть контрольный класс, который создает экземпляры ViewModels и Views и "присоединяет их". Затем C также обрабатывает получение данных (и кэширует их и т.д.) И любую связь через виртуальные машины и Vs (например, если экземпляр V создается, маршрутизирует команду своей виртуальной машине для выполнения какого-либо действия, VM, вероятно, попросит C выполнить действие от его имени, C может затем поднять соответствующие события, которые другие VM могут обрабатывать

Если (независимо от того, используете ли вы контроллер или нет), мне нужна виртуальная машина, чтобы поговорить с другой виртуальной машиной, это сложнее сделать, если V создает экземпляр виртуальной машины - потому что мне не нужно подвергать виртуальную машину в V (или, по крайней мере, сделайте некоторый интерфейс доступным, чтобы вторая VM могла поговорить с 1-м).

Ответ 4

Сначала мы использовали ViewModel, но когда я пришел на аутсорсинг, и использование смеси стало самым важным, мой босс сказал, что View-first лучше, чем Viewmodel-first - я не согласен с ним (но один из многих не лучшее соотношение голосов;-)), потому что теперь у нас есть некоторые странные связи с событиями зрения в коде позади. Теперь я не вернусь, и я застрял в некоторых пользовательских элементах управления - из-за изменений.

Ответ 5

Я использую подход View-first (sort-of). Я определяю View в сотрудничестве с моим клиентом с манекеном viewmodel с тестовыми данными. Когда мы будем удовлетворены, я приступаю к извлечению интерфейса из 'dummy' и реализую реальный ViewModel. Я нашел этот подход наиболее привлекательным по следующим причинам:

  • Быстро, так как прототипирование дорого стоит по времени, и я часто делаю это правильно (ish) в четвертой или пятой попытке.
  • ViewModels имеют тенденцию быть легкими (проще) для реализации, когда у меня есть интерфейс, чтобы придерживаться.

Я работаю в WPF, но я бы подумал, что это не будет слишком разным в SL. Кроме того, я никогда не трачу время на тестирование представлений, которые могут относиться к моему выбору подхода.

Ответ 6

Я предпочитаю использовать первый подход к модели представления. По многим причинам:

  • Vms - это ваше приложение, содержащее большую часть логики, помимо кода клея в форме поведения или триггеров.
  • Если вы создаете представления, вы отвечаете за его код жизни и очистки. Вы должны иметь дело с потоками и другими проблемами, которые трудно проверить. С другой стороны, вы создаете vms и оставляете логику создания представлений с помощью WPF через шаблон данных. Вам не нужно беспокоиться о проблеме потоковой передачи. И будет лучшее разделение проблем.
  • С vm первым обратным нулевым кодом.
  • С изолией уровня проекта для просмотра и vms вы можете ограничить разработчиков, используя определенные вещи, такие как диспетчер в модели представления, оставляя более чистую и тестовую базу кода. I.e просмотреть проект sprojec до vm. И проект vm не должен ссылаться на какую-либо презентационную библиотеку.
  • Если существует четкая граница между представлением и vm. Оба могут развиваться и быть менее хрупкими.