В чем разница между MVC и MVVM?

Вот некоторые статические методы, которые вы можете использовать для получения MaxLength или любого другого атрибута.

using System;
using System.Linq;
using System.Reflection;
using System.ComponentModel.DataAnnotations;
using System.Linq.Expressions;

public static class AttributeHelpers {

public static Int32 GetMaxLength<T>(Expression<Func<T,string>> propertyExpression) {
    return GetPropertyAttributeValue<T,string,MaxLengthAttribute,Int32>(propertyExpression,attr => attr.Length);
}

//Optional Extension method
public static Int32 GetMaxLength<T>(this T instance,Expression<Func<T,string>> propertyExpression) {
    return GetMaxLength<T>(propertyExpression);
}


//Required generic method to get any property attribute from any class
public static TValue GetPropertyAttributeValue<T, TOut, TAttribute, TValue>(Expression<Func<T,TOut>> propertyExpression,Func<TAttribute,TValue> valueSelector) where TAttribute : Attribute {
    var expression = (MemberExpression)propertyExpression.Body;
    var propertyInfo = (PropertyInfo)expression.Member;
    var attr = propertyInfo.GetCustomAttributes(typeof(TAttribute),true).FirstOrDefault() as TAttribute;

    if (attr==null) {
        throw new MissingMemberException(typeof(T).Name+"."+propertyInfo.Name,typeof(TAttribute).Name);
    }

    return valueSelector(attr);
}

}

Использование статического метода ...

var length = AttributeHelpers.GetMaxLength<Player>(x => x.PlayerName);

Или используя необязательный метод расширения для экземпляра ...

var player = new Player();
var length = player.GetMaxLength(x => x.PlayerName);

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

var length = AttributeHelpers.GetPropertyAttributeValue<Player,string,StringLengthAttribute,Int32>(prop => prop.PlayerName,attr => attr.MaximumLength);

Вдохновленный ответ Микаэля Энгвера.

1238
задан skaffman 17 November 2009 в 08:21
поделиться

9 ответов

MVC / MVVM не является выбором или / или .

Эти два шаблона по-разному возникают при разработке как ASP.Net, так и Silverlight / WPF.

Для ASP.Net MVVM используется для двустороннего связывания данных в представлениях. Обычно это реализация на стороне клиента (например, с использованием Knockout.js). С другой стороны, MVC - это способ разделения задач на стороне сервера .

Для Silverlight и WPF шаблон MVVM является более всеобъемлющим и может появиться как замена MVC (или других шаблонов организации программного обеспечения с разделением обязанностей).Одно предположение, которое часто исходило из этого шаблона, заключалось в том, что ViewModel просто заменил контроллер в MVC (как если бы вы могли просто заменить VM на ] C в аббревиатуре, и все будет прощено) ...

ViewModel не обязательно заменяет необходимость в отдельных контроллерах.

Проблема в том, что для того, чтобы можно было независимо тестировать * и, особенно, повторно использовать при необходимости, модель представления не знает, какое представление ее отображает, но, что более важно , не знает, откуда берутся ее данные .

* Примечание: на практике контроллеры удаляют большую часть логики из ViewModel, которая требует модульного тестирования. Затем виртуальная машина становится тупым контейнером, который практически не требует тестирования. Это хорошо, поскольку виртуальная машина - это просто мост между проектировщиком и кодировщиком, поэтому ее следует сохранять простыми.

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

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

Основные принципы MVCVM, которым мы следуем:

  • Представления отображают данные определенной формы . Они понятия не имеют, откуда берутся данные.
  • ViewModels содержат определенную форму данных и команд , они не знают, откуда берутся данные или код и как они отображаются.
  • Модели хранят фактические данные (различные контексты, хранилища или другие методы).
  • Контроллеры прослушивают и публикуют события. Контроллеры предоставляют логику, которая контролирует, какие данные и где будут отображаться. Контроллеры предоставляют код команды ViewModel, так что ViewModel фактически можно использовать повторно.

Мы также отметили, что структура генерации кода Sculpture реализует MVVM и шаблон, аналогичный Prism, И также широко использует контроллеры для разделения всей логики вариантов использования.

Не думайте, что контроллеры устарели из-за View-моделей.

Я завел блог на эту тему, и буду добавлять, когда смогу . Есть проблемы с объединением MVCVM с общими навигационными системами, поскольку большинство навигационных систем просто используют представления и виртуальные машины, но я расскажу об этом в следующих статьях.

Дополнительным преимуществом использования модели MVCVM является то, что только объекты контроллера должны существовать в памяти в течение всего срока службы приложения , а контроллеры содержат в основном код и небольшие данные о состоянии (т. Е. Крошечные накладные расходы на память). . Это делает приложения с гораздо меньшим объемом памяти, чем решения, в которых необходимо сохранять модели представления, и идеально подходит для определенных типов мобильной разработки (например, Windows Mobile с использованием Silverlight / Prism / MEF). Это, конечно, зависит от типа приложения, так как вам все равно может потребоваться сохранить случайные кэшированные виртуальные машины для быстрого реагирования.

Примечание: этот пост редактировался много раз и не касался конкретно заданного узкого вопроса, поэтому я обновил первую часть, чтобы теперь охватить и его. Большая часть обсуждения в комментариях ниже относится только к ASP.Net, а не к более широкой картине. Этот пост был предназначен для освещения более широкого использования MVVM в Silverlight, WPF и ASP.Net и попытки отговорить людей от замены контроллеров на ViewModels.

667
ответ дан 19 December 2019 в 20:14
поделиться

С одной стороны, MVVM является прогрессией шаблона MVC, который использует XAML для обработки дисплея. Эта статья обрисовывает в общих чертах некоторые фасеты двух.

основная тяга архитектуры Model/View/ViewModel, кажется, что сверху данных (”the Model”), there’s другой слой невидимых компонентов (”the ViewModel”), которые отображают понятие данных более тесно к понятию представления данных (”the View”). It’s ViewModel, который Представление связывает с, не Модель непосредственно.

88
ответ дан sll 17 November 2009 в 18:21
поделиться

Образцовое Представление ViewModel MVVM подобно MVC, Контроллер Образцового Представления

, контроллер заменяется ViewModel. ViewModel располагается ниже уровня UI. ViewModel представляет объекты данных и объекты команды, в которых нуждается представление. Вы могли думать об этом как о контейнерном объекте, от которого представление идет для получения его данных и действий. ViewModel вытягивает свои данные из модели.

Russel East делает блог, обсуждая больше подробно , Почему MVVM, отличается от MVC

173
ответ дан Just a learner 17 November 2009 в 18:21
поделиться

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

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

9
ответ дан eglasius 17 November 2009 в 18:21
поделиться
  • 1
    @CuiPengFui, наследование об обязанностях по типу (это - то, что я делаю). Конструкторы о сотрудничестве типа (это - то, в чем я нуждаюсь). Так это вид имеет философский смысл (при рассмотрении его боком), что конструкторы являются not' t наследованный - эти 2 понятия являются главным образом ортогональными. – RoadWarrior 9 May 2012 в 04:32

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

18
ответ дан 19 December 2019 в 20:14
поделиться

Model†“View†“Контроллер (обычно известный как [1 122] MVC) является шаблоном программного дизайна, наиболее часто используемым для разработки пользовательских интерфейсов, которые делят связанную логику программы на три взаимосвязанных элемента. Это сделано для разделения внутренних представлений информации от способов, которыми информация представлена и принята пользователем. После архитектурного шаблона MVC отделяет эти главные компоненты, допускающие повторное использование кода и параллельную разработку.

Традиционно используемый для настольных графических интерфейсов пользователя (графический интерфейсы пользователя), этот шаблон стал популярным для разработки веб-приложений. Популярные языки программирования как JavaScript, Python, Ruby, PHP, Java и C# имеют платформы MVC, которые используются в разработке веб-приложения прямо из поля.

Модель

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

Представление

Любое представление информации, такой как диаграмма, схема или таблица. Несколько представлений той же информации возможны, таковы как столбиковая диаграмма для управления и табличное представление для бухгалтеров.

Контроллер

Принимает вход и преобразовывает его в команды для модели или представление.

В дополнение к делению приложения в эти компоненты, model†“view†“проектирование контроллера определяет взаимодействия между ними.

модель ответственна за управление данными приложения. Это получает ввод данных пользователем от контроллера.

представление означает презентацию модели в конкретном формате.

контроллер отвечает на ввод данных пользователем и выполняет взаимодействия на объектах модели данных. Контроллер получает вход, дополнительно проверяет его и затем передает вход модели. enter image description here

Model†“View†“ViewModel (MVVM) является программным обеспечением архитектурный шаблон.

MVVM упрощает разделение разработки графического интерфейса пользователя †“, быть этим через язык разметки или GUI кодируют †“от разработки бизнес-логики или логики бэкенда (модель данных). Модель представления MVVM является преобразователем значения, означая, что модель представления ответственна за представление (преобразования) объектов данных из модели таким способом, которым объектами легко управляют и представляют. В этом отношении модель представления является большим количеством модели, чем представление и обрабатывает больше всего если не вся логика дисплея представления. Модель представления может реализовать шаблон посредника, организовав доступ к логике бэкенда вокруг набора вариантов использования, поддерживаемых представлением.

MVVM является изменением шаблона разработки Модели Презентации Martin Fowler. MVVM абстрагирует состояние и поведение представления таким же образом, но Модель Презентации абстрагирует представление (создает модель представления) способом, не зависящим от определенной платформы пользовательского интерфейса.

MVVM был изобретен архитекторами Microsoft Ken Cooper и Ted Peters конкретно для упрощения событийно-ориентированного программирования пользовательских интерфейсов. Шаблон был включен в Windows Presentation Foundation (WPF) (графическая система.NET Microsoft) и Silverlight (производная интернет-приложения WPF). John Gossman, один из WPF Microsoft и архитекторов Silverlight, объявил о MVVM на своем блоге в 2005.

Model†“View†“ViewModel также упоминается как model†“view†“редактор связей, особенно в реализациях, не включающих платформу.NET. ZK (платформа веб-приложений, записанная в Java) и KnockoutJS (библиотека JavaScript), используют model†“view†“редактор связей. enter image description here

1
ответ дан 19 December 2019 в 20:14
поделиться

Модель просмотра является "абстрактной" модель для элементов вашего пользовательского интерфейса. Он должен позволять вам выполнять команды и действия в вашем представлении невизуальным способом (например, для тестирования).

Если вы работали с MVC, вы, вероятно, когда-нибудь сочли полезным создавать объекты модели, отражающие состояние вашего представления, например, для отображения и скрытия некоторых диалоговых окон редактирования и т. Д. В этом случае вы используете модель представления.

Шаблон MVVM - это просто обобщение этой практики на все элементы пользовательского интерфейса.

И это не шаблон Microsoft, добавляется лишь то, что привязки данных WPF / Silverlight особенно хорошо подходят для работы с этим шаблоном. Но ничто не мешает вам использовать его, например, с гранями сервера Java.

14
ответ дан 19 December 2019 в 20:14
поделиться

Я думал, что одно из основных отличий заключается в том, что в MVC ваш V читает ваш M напрямую и переходит через C для управления данными, тогда как в MVVM ваша виртуальная машина действует как прокси-сервер M, а также предоставляет доступные функциональность для вас V.

Если я не полон мусора, я удивлен, что никто не создал гибрид, где ваша виртуальная машина является просто прокси-сервером M, а C обеспечивает все функции.

44
ответ дан 19 December 2019 в 20:14
поделиться

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

9
ответ дан 19 December 2019 в 20:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: