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

MVVM ViewModel против MVC ViewModel

ViewModel - это термин, который используется как в MVVM (Model-View-ViewModel), так и в рекомендуемой реализации для ASP.NET MVC. Исследование "ViewModel" может сбивать с толку, учитывая, что каждый шаблон использует один и тот же термин.

В чем основные отличия MVC ViewModel и MVVM ViewModel? Например, я считаю, что MVVM ViewModel более богат, учитывая отсутствие контроллера. Это правда?

4b9b3361

Ответ 1

Довольно сложный вопрос, чтобы ответить лаконично, но я попытаюсь. (Имейте в виду, что ответы на эти вопросы по-прежнему являются предметом дебатов среди разработчиков.)

В MVC ViewModel предоставляет всю информацию, необходимую для визуализации Представления. Содержащиеся в нем данные создаются с использованием данных, определенных в модели. Вид читает ViewModel и выводит результат. Вход из представления передается контроллеру, который управляет моделью, создает подходящую ViewModel и передает ее в представление для рендеринга.

В MVVM ViewModel выполняет те же функции, что и в MVC, но также заменяет часть MVC-контроллера, предоставляя команды, которые позволяют View обрабатывать модель. Конфигурация данных WPF управляет обновлением представления в соответствии с изменениями в ViewModel (и это эффективно заменяет оставшуюся функцию MVC-контроллера).

Ответ 2

Прошло некоторое время с тех пор, как я играл в UI Design Patterns Bingo.. однако позвольте мне взять удар по этому поводу.

MVVM - это просто то, что MS придумала... потому что это помогает вам максимально использовать WPF. Вы комбинируете состояние и поведение представления в класс (модель презентации), который легко тестируется +, затем вы используете привязку данных для получения данных в любом виде.

Эта ссылка содержит краткую информацию об эволюции MVVM. Объедините это с Fowler " GUI Architectures", и вы должны быть в пути.

Обновление: не знал, что было что-то, называемое MVC-VM. По-видимому, детище ASP.NET MVC. Взгляды и звуки похожи на MVVM (кроме настроенных для ASP.NET MVC); единственное отличие состоит в том, что он устанавливает ограничение на сопоставление 1:1 между VM и View. Я бы догадался 1: N, но все остальное соответствует.

Ответ 3

Я знаю, что это (путь) старый вопрос, но я указал на него как пример использования "View Model" в контексте MVC. Я утверждаю, что это неверно и может привести к путанице со стороны людей, которые не знакомы ни с одной, ни с другой. Кто бы это ни делал - стафф. Вот почему (и это даже ответ на исходный вопрос обходным путем).

Пример того, когда это происходит, можно увидеть в этом вопросе. Пользователь пытается использовать View Model, которая реализует INotifyPropertyChanged в приложении ASP.NET MVC, тем самым сглаживая дизайн рабочего стола и безстоящего веб-приложения в архитектурной неудаче и горя.

Проще говоря, в шаблоне MVC нет "View Model". Существует, однако, функциональный эквивалент и что контроллер. Чтобы просто прояснить детали и их пурпуры,

MVVM (настольные приложения):

  • Модель - сильно типизированный объект, который содержит данные, которые должны быть переданы между View и View Model
  • Вид - пользовательский интерфейс, просматриваемый пользователем и через который пользователь взаимодействует с системой
  • View Model - интерпретирует действия пользователя (например, через ICommand), выполняет их, обновляет состояние приложения

MVC (веб-приложения):

  • Модель - сильно набранный * объект, который содержит данные, которые должны передаваться между View и View Model
  • View - генератор пользовательского интерфейса, который объединяет модель, код и HTML для рендеринга веб-страницы.
  • Controller - принимает пользовательские запросы, интерпретирует их, обновляет состояние приложения и использует представление для преобразования этого состояния в веб-страницу HTML.

Модель практически одинакова в обеих моделях. Модели на рабочем столе могут реализовывать уведомления о событиях обновлений, веб-модели могут быть динамическими (то есть не строго типизированными), и оба могут включать или не включать методы проверки или метаданные.

Просмотр на рабочем столе - это то, что видит пользователь. В Интернете это генератор, который выводит HTML для браузеров для отображения на стороне клиента. Он должен интерпретировать взаимодействие пользователя на рабочем столе, но в Интернете, который обрабатывается javascript на стороне клиента, браузер и запросы, которые отправляются обратно на сервер.

Модель View/Controller примерно функционально эквивалентна, но сильно различаются в том, как они реализованы и как они работают. В модели просмотра взаимодействие пользователя с приложением переносится в View Models через ICommands, маршрутизируемые события и другие методы (многие MVVM-фреймворки предоставляют различные способы привязки моделей к пользовательскому интерфейсу и другим частям выражение). В контроллере запрашивается вся информация, необходимая для того, чтобы контроллер возвращал результат пользователю (при условии, что он запросил 200 OK). Контроллер должен выполнить любую работу, необходимую для создания состояния (aka Model), необходимого для генератора HTML (вид), чтобы создать ответ. Конструктивно, контроллер находится над знанием View и Model и контролирует оба, тогда как ViewModel сидит рядом с представлением, передавая вместе с ним модель (и другую информацию).

На самом деле кажется, что некоторые люди путают некоторых людей, так это то, что существуют MVVM-структуры на стороне клиента, которые вы можете смешивать в своем приложении MVC. Они существуют исключительно в javascript в пользовательском браузере и не имеют никакого отношения к какому-либо конкретному шаблону, который вы используете на стороне сервера. Вы можете запустить классический веб-сайт ASP, который использует MVVM на стороне клиента. Черт, вы можете запускать статические HTML-страницы, которые используют MVVM на стороне клиента. Они отделены друг от друга.

Эти фреймворки MVVM javascript обычно следуют аналогичной схеме для шаблона MVVM рабочего стола, описанного выше, но настроены так, чтобы работать в большей степени с характером HTML DOM и javascript. Например, в DOM нет обширной системы привязки, и javascript имеет очень ограниченную систему типов, поэтому сопоставление шаблонов с моделями намного отличается от того, что используется в WPF. Они также, как правило, отключены от сервера, и когда им нужно взаимодействовать, предпочитайте вызовы AJAX, а не POSTing страницы обратно контроллеру (вызовы AJAX обычно обрабатываются контроллерами WebAPI в ASP.NET MVC).

Итак, чтобы суммировать, в MVC действительно нет модели просмотра. Контроллер является грубым эквивалентом, но очень отличается тем, как он получает ввод пользователя, интерпретирует его и возвращает результат пользователю. Использование термина "Просмотр модели" для ссылки на что-либо в MVC может привести только к путанице, и поэтому его следует избегать. Используйте правильные термины для правильных частей шаблона. Это может показаться педантичным, но это должно помочь держать вещи ясными и быть менее запутанными для людей, которые являются новыми для обоих образцов.