Какой смысл иметь и модель, и модель представления в MV-VM? - PullRequest
7 голосов
/ 23 декабря 2011

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

Должна быть веская причина для их разделения.Чего мне не хватает?

Ответы [ 4 ]

7 голосов
/ 23 декабря 2011

ViewModel - это мягкая копия из View, т. Е. Если у вас есть обновляемое ListBox в представлении, у вас будет ObservableCollection в вашей ViewModel, которую представляет этот список элементов в списке. Точно так же, если у вас есть Button на вашем View, VM будет удерживать его Command.

Model будет фактически тем, что имеет данные, которые показывает View. Таким образом, коллекция типов в вашем VM может быть названа классом Model.

например. Employees ListView является View и имеет контекст данных, который является экземпляром класса EmployeeViewModel, который имеет свойство ObservableCollection класса Employee, где Employee класс становится Model.

Обычно существует соотношение 1-1 между View и VM и отношение 1-N между VM и Model.

3 голосов
/ 24 декабря 2011

Модель является доменом вашего приложения и поэтому содержит логику вашего домена, такую ​​как бизнес-правила и проверки. ViewModel - это модель для вашего представления. Он обрабатывает взаимодействия между пользователем и представлением, то есть когда пользователь нажимает кнопку, модель представления будет обрабатывать это взаимодействие и может вносить или не вносить изменения в модель. Обычно на языке OO вы хотите, чтобы ваши объекты имели только одну ответственность.

В WPF ViewModel обычно реализует интерфейс INotifyPropertyChange, который затем просматривается представлением для любых изменений. Вы не хотели бы, чтобы модель реализовала этот интерфейс, так как он в любом случае не связан с вашим доменом.

Еще одна причина разделения заключается в том, что иногда в вашем представлении не обязательно отображать все данные, содержащиеся в модели. Например, если ваша модель предоставляет 15 свойств, но в одном из ваших представлений пользователь должен видеть только 5 из этих свойств. Если вы поместите вашу модель в ViewModel, представление будет доступно для всех 15 свойств, тогда как если вы инкапсулируете модель в ViewModel, тогда только эти 5 свойств будут доступны представлению.

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

2 голосов
/ 25 декабря 2011

Первым реальным недостатком этого является отсутствие разделения интересов.И скоро это приведет к избыточному коду.Тем не менее, я много раз видел, как разработчики использовали свои объекты Model в качестве ViewModels.И если мы абсолютно честны с самими собой, в очень тонком приложении разделение этих понятий может на самом деле привести к большей избыточности.

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

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

2 голосов
/ 23 декабря 2011

Мой простой ответ (и я не претендую на WPF Guru ) заключается в том, что в WPF вам понадобится виртуальная машина, когда:
1. Вы не хотитепредоставить всю вашу модель конкретному представлению
2. Ваша модель не в «стиле WPF» (не реализует INotifyPropertyChanged, нет наблюдаемых коллекций или команд).

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