В чем разница между MVC и MVVM? - PullRequest
1224 голосов
/ 20 марта 2009

Есть ли разница между стандартным шаблоном "Model View Controller" и шаблоном Microsoft Model / View / ViewModel?

Ответы [ 23 ]

9 голосов
/ 15 октября 2014

Внедрение строго типизированных моделей представления в представление с использованием MVC

  1. Контроллер отвечает за обновление ViewModel и внедрение его в View. (для получения запросов)
  2. ViewModel - это контейнер для DataContext и состояния просмотра, такого как последний выбранный элемент и т. Д.
  3. Модель содержит объекты БД и очень близка к схеме БД, которая выполняет запросы и фильтрацию. (Мне нравятся EF и LINQ для этого)
  4. Модель также должна учитывать репозитории и / или проекцию результатов в строгие типы (EF имеет отличный метод ... EF.Database.Select (querystring, parms) для прямого доступа ADO для вставки запросов и получения сильных типов. адрес EF - медленный аргумент. EF НЕ МЕДЛЕННЫЙ !
  5. ViewModel получает данные и выполняет бизнес-правила и проверку
  6. Контроллер на post back будет вызывать метод ViewModel Post и ждать результатов.
  7. Контроллер вставит недавно обновленную Viewmodel в View. В представлении используется только сильная привязка типа .
  8. Представление просто отображает данные и отправляет события обратно в контроллер. (см. примеры ниже)
  9. MVC перехватывает входящий запрос и направляет его на соответствующий контроллер с типом данных strong

В этой модели больше нет уровня HTTP контакт с объектами запроса или ответа, поскольку машина MVC MSFT скрывает это от нас.

В пояснениях к пункту 6 выше (по запросу) ...

Предположим, что ViewModel выглядит так:

public class myViewModel{
     public string SelectedValue {get;set;}
public void Post(){
    //due to MVC model binding the SelectedValue string above will be set by MVC model binding on post back.
    //this allows you to do something with it.
    DoSomeThingWith(SelectedValue);
    SelectedValue = "Thanks for update!";
 }
}

Метод контроллера сообщения будет выглядеть следующим образом (см. Ниже), обратите внимание, что экземпляр mvm автоматически создается механизмами привязки MVC. В результате вам никогда не придется опускаться до слоя строки запроса! Это MVC для вас создает ViewModel на основе строк запроса!

[HTTPPOST]   
public ActionResult MyPostBackMethod (myViewModel mvm){
         if (ModelState.IsValid)
        {
               // Immediately call the only method needed in VM...
               mvm.Post()
        }
      return View(mvm);
}

Обратите внимание, что для того, чтобы описанный выше метод действия работал так, как вы предполагаете, у вас должен быть определен нулевой CTOR, который инициализирует вещи, не возвращенные в посте. Обратная запись также должна отправлять обратно пары имя / значение для тех вещей, которые изменились. Если отсутствуют пары имя / значение, механизм привязки MVC делает правильные вещи, которые просто ничего! Если это произойдет, вы, возможно, скажете: «Я теряю данные на постах» ...

Преимущество этого шаблона заключается в том, что ViewModel выполняет всю "беспорядочную" работу, взаимодействуя с логикой Model / Buisness, а контроллер является просто своего рода маршрутизатором. Это SOC в действии.

9 голосов
/ 26 августа 2014

Меня удивляет, что это высоко оцененные ответы без упоминания происхождения MVVM. MVVM - это популярный термин, используемый в сообществе Microsoft, и он возник из презентационной модели Мартина Фаулера . Итак, чтобы понять мотив шаблона и отличия от других, следует прочитать оригинальную статью о шаблоне.

9 голосов
/ 22 августа 2010

Из того, что я могу сказать, MVVM сопоставляется с MV MVC - это означает, что в традиционном шаблоне MVC V не связывается напрямую с M. Во второй версии MVC существует прямая связь между M и V. MVVM, кажется, берет на себя все задачи, связанные со связью M и V, и соединяет их, чтобы отделить их от C. В действительности, все еще существует более широкий рабочий процесс приложения (или реализация сценариев использования), которые не полностью учтены в MVVM. Это роль контроллера. Удаляя эти низкоуровневые аспекты из контроллеров, они становятся чище и упрощают изменение сценария использования приложения и бизнес-логики, а также делают контроллеры более пригодными для повторного использования.

9 голосов
/ 20 марта 2009

MVVM добавляет модель вида в микс. Это важно, поскольку позволяет вам использовать подход связывания WPF, не прибегая к этим частям пользовательского интерфейса в вашей обычной модели.

Возможно, я ошибаюсь, но я не уверен, что MVVM действительно заставляет контроллер вмешиваться. Я считаю, что концепция более соответствует: http://martinfowler.com/eaaDev/PresentationModel.html. Я думаю, что люди предпочитают комбинировать его с MVC, а не то, что он встроен в шаблон.

7 голосов
/ 19 мая 2018

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

Пытаясь пролить свет на вышесказанное, я составил этот сценарий с участием MVVM, MVP и MVC. История начинается с того, что пользователь нажимает кнопку «НАЙТИ» в приложении для поиска фильмов…:

Пользователь: Нажмите…

Просмотр : Кто это? [ MVVM | MVP | MVC ]

Пользователь: Я только что нажал на кнопку поиска ...

Просмотр : Хорошо, подождите секунду…. [ MVVM | MVP | MVC ]

( Просмотр вызова ViewModel | Presenter | Контроллер …) [ MVVM | MVP | MVC ]

Просмотр : Привет ViewModel | Presenter | Контроллер , пользователь только что нажал на кнопку поиска, что мне делать ? [ MVVM | MVP | MVC ]

ViewModel | Presenter | Контроллер : Привет View , есть ли поисковый запрос на этой странице? [ MVVM | MVP | MVC ]

Вид : Да,… вот оно… «пианино» [ MVVM | MVP | MVC ]

—— Это самое важное различие между MVVM И MVP | MVC ———

Ведущий : Спасибо Просмотр , ... пока что я ищу поисковый запрос по Модель , покажите ему / ей индикатор выполнения [ MVP | MVC ]

( Presenter | Контроллер вызывает Модель …) [ MVP | MVC ]

ViewController : Спасибо, я буду искать поисковый запрос на Модель , но не буду обновлять вас напрямую. Вместо этого я буду инициировать события для searchResultsListObservable, если есть какой-либо результат. Так что тебе лучше наблюдать за этим. [* 1 099 * MVVM ]

(Наблюдая за любым триггером в searchResultsListObservable, View считает, что должен показывать пользователю какой-то индикатор выполнения, поскольку ViewModel не будет с ним разговаривать)

------------------------------

ViewModel | Presenter | Контроллер : Привет Модель , У вас есть совпадения по этому поисковому запросу: «фортепиано» [ MVVM | MVP | MVC ]

Модель : Привет ViewModel | Ведущий | Контроллер , позвольте мне проверить… [ MVVM | MVP | MVC ]

( Модель делает запрос к базе данных фильмов…) [ MVVM | MVP | MVC ]

(Через некоторое время ...)

———— Это точка расхождения между MVVM , MVP и MVC ————

Модель : Я нашел для вас список, ViewModel | Presenter , вот он в JSON «[{« name »:« Piano Teacher » , «Year»: 2001}, {«name»: «Piano», «year»: 1993}] »[ MVVM | MVP ]

Модель : Доступен какой-то результат, контроллер. Я создал переменную поля в моем экземпляре и заполнил ее результатом. Это имя «searchResultsList» [ MVC ]

( Presenter | Контроллер спасибо Модель и возвращается к View ) [ MVP | MVC ]

Ведущий : Спасибо за ожидание Просмотр , я нашел для вас список подходящих результатов и упорядочил их в презентабельном формате: [«Piano Teacher 2001», «Piano 1993» ]. Также, пожалуйста, скройте индикатор выполнения [ MVP ]

Контроллер : Спасибо за ожидание Просмотр , я спросил модель о вашем поисковом запросе. Он говорит, что нашел список подходящих результатов и сохранилem в переменной с именем «searchResultsList» внутри своего экземпляра. Вы можете получить это оттуда. Также, пожалуйста, скрыть индикатор выполнения сейчас [ MVC ]

ViewModel : Любой наблюдатель в searchResultsListObservable может быть уведомлен о наличии нового списка в презентабельном формате: [«Piano Teacher 2001», «Piano 1993»]. 1215 *

Просмотр : Большое спасибо Ведущий [ MVP ]

Просмотр : Спасибо « Контроллер » [ MVC ] (Теперь Просмотр задается вопросом: как мне представить результаты, которые я получаю от Model для пользователя? Должен ли год производства фильма быть первым или последним…?)

Представление : О, есть новый триггер в searchResultsListObservable…, хорошо, есть презентабельный список, теперь мне нужно только показать его в списке. Я должен также скрыть индикатор выполнения теперь, когда у меня есть результат. [ MVVM ]

Если вам интересно, я написал серию статей здесь , сравнивающих MVVM, MVP и MVC с помощью приложения для поиска фильмов для Android.

6 голосов
/ 28 сентября 2013

Ну, обычно MVC используется в веб-разработке, а MVVM наиболее популярен в разработке WPF / Silverlight. Однако иногда веб-архитектура может иметь сочетание MVC и MVVM.

Например: вы можете использовать knockout.js , и в этом случае у вас будет MVVM на стороне клиента. И сторона сервера вашего MVC также может измениться. В сложных приложениях никто не использует чистую модель. Возможно, имеет смысл использовать ViewModel в качестве «Модели» MVC, и ваша настоящая Модель в основном будет частью этой ВМ. Это дает вам дополнительный уровень абстракции.

4 голосов
/ 24 июня 2018

Контроллер не заменяется ViewModel в MVVM, потому что ViewModel имеет совершенно другую функциональность, чем Controller. Вам все еще нужен контроллер, потому что без контроллера ваша модель, ViewModel и View не будут иметь большого значения ... В MVVM у вас также есть контроллер, имя MVVM просто вводит в заблуждение.

MVVMC - правильное имя, по моему скромному мнению.

Как вы можете видеть, ViewModel - это просто дополнение к шаблону MVC. Он перемещает логику преобразования (например, преобразовать объект в строку) из контроллера в модель представления.

4 голосов
/ 09 октября 2010

MVVMC, или, возможно, MVC +, представляется жизнеспособным подходом как для предприятия, так и для быстрой разработки приложений. Хотя приятно отделить пользовательский интерфейс от бизнес-логики и логики взаимодействия, «чистый» шаблон MVVM и большинство доступных примеров лучше всего работают с единичными представлениями.

Не уверен насчет ваших дизайнов, но большинство моих приложений, тем не менее, содержат страницы и несколько (многократно используемых) представлений, и, следовательно, ViewModels действительно должны взаимодействовать до некоторой степени. Использование страницы в качестве контроллера отрицательно сказалось бы на цели MVVM, поэтому отказ от использования подхода «VM-C» для базовой логики может привести к… ну… сложным конструкциям по мере развития приложения. Даже в VB-6 большинство из нас, вероятно, прекратили кодировать бизнес-логику в событие Button и начали «передавать» команды на контроллер, верно? Я недавно посмотрел на множество новых фреймворков на эту тему; мой любимый, безусловно, подход Magellan (в codeplex). Удачного кодирования!

http://en.wikipedia.org/wiki/Model_View_ViewModel#References

2 голосов
/ 02 марта 2017

Раньше я думал, что MVC и MVVM одинаковы. Теперь из-за существования Flux я могу сказать разницу:

В MVC для каждого представления в вашем приложении у вас есть модель и контроллер, так что я бы назвал это view, view model, view controller. Шаблон не говорит вам, как один вид может общаться с другим. Поэтому в разных средах для этого есть разные реализации. Например, есть реализации, где контроллеры общаются друг с другом, тогда как в других реализациях есть другой компонент, который является посредником между ними. Существуют даже реализации, в которых модели представлений взаимодействуют друг с другом, что является нарушением шаблона MVC, поскольку доступ к модели представлений должен выполнять только контроллер представления.

В MVVM у вас также есть модель представления для каждого компонента. Шаблон не определяет, как чертовски представление должно влиять на модель представления, поэтому обычно большинство структур просто включает функциональность контроллера в модель представления. Однако MVVM сообщает, что данные модели представления должны поступать из модели, то есть всей модели, которая не знает или не настроена для конкретного представления.

Чтобы продемонстрировать разницу, давайте возьмем модель потока. Шаблон потока рассказывает, как должны взаимодействовать различные представления в приложении. Каждый вид прослушивает магазин и запускает действия с помощью диспетчера. Диспетчер, в свою очередь, сообщает всем магазинам о только что выполненном действии, и магазины обновляются сами. Магазин в Flux соответствует (общей) модели в MVVM. это не обычай для какого-либо конкретного представления. Поэтому обычно, когда люди используют React и Flux, каждый компонент React фактически реализует шаблон MVVM. Когда происходит действие, модель представления вызывает диспетчера, и, наконец, она обновляется в соответствии с изменениями в хранилище, которым является модель. Нельзя сказать, что каждый компонент реализует MVC, потому что в MVC только контроллер может обновлять модель представления. Таким образом, MVVM может работать вместе с Flux (MVVM управляет связью между представлением и моделью представления, а Flux обрабатывает связь между разными представлениями), тогда как MVC не может работать с Flux без нарушения ключевого принципа.

2 голосов
/ 17 декабря 2014

С практической точки зрения MVC (Model-View-Controller) - это шаблон. Однако MVC при использовании в качестве ASP.net MVC в сочетании с Entity Framework (EF) и «мощными инструментами» является очень мощным, частично автоматизированным подходом для переноса баз данных, таблиц и столбцов на веб-страницу для любого Только операции CRUD или R (извлечение или чтение). По крайней мере, когда я использовал MVVM, модели представлений взаимодействовали с моделями, которые зависели от бизнес-объектов, которые, в свою очередь, были «сделаны вручную», и после долгих усилий удалось получить модели, которые были так же хороши, как и EF. -of коробки». С практической точки зрения программирования, MVC кажется хорошим выбором, потому что он дает много полезных функций, но все еще есть потенциал для добавления наворотов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...