Я полагаю, что реальный вопрос в том, насколько верным вам будет шаблон MVVM?
Идея, лежащая в основе MVVM, а также аналогичных шаблонов, таких как MVC и MVP, заключается в разделении интересов. Хотя я тоже трудился над этой темой, я более внимательно посмотрел на то, что шаблон пытается достичь, и выбор стал легче.
С MVVM у вас есть три проблемы: View (V), Model (M) и ViewModel (VM). Кажется довольно очевидным, верно? Но спросите себя, о чем действительно беспокоится каждый и что произойдет, если мы начнем смешивать проблемы - так же, как это происходит, когда мы смешиваем проблемы в других местах. Наш код становится все труднее изменить.
Имея это в виду, рассмотрим случай, когда вы позволяете пользовательскому интерфейсу проникать в вашу модель представления, раскрывая свойство, которое использует тип пользовательского интерфейса. Это часто встречается при работе с диалогами (основной источник головной боли в MVVM). Допустим, вы разрабатываете свое приложение с использованием стороннего набора элементов управления, и тип интерфейса пользователя - один из их. Теперь вам нужно внести несколько изменений, если вы меняете наборы элементов управления, а не просто меняете разметку пользовательского интерфейса (или это делает дизайнер).
(Это свежо, на мой взгляд, потому что я только что предпринял такую попытку, и настоящие MVVM-приложения было несложно изменить, в то время как другим потребовалось в 10-25 раз больше времени!)
Этот же сценарий влияет и на «конец» шаблона.
Целью модели является передача данных в / из любого механизма персистентности, который вы используете со своим приложением. Это может быть веб-служба, база данных, текстовый файл и т. Д. Тот факт, что WCF добавляет такие возможности, как INotifyPropertyChanged, не означает, что их использование рекомендуется. Помните, что Microsoft занимается разработкой инструментов. Чтобы продавать эти инструменты, они должны работать в различных ситуациях и на разных уровнях. RIA Services, например, отлично подходит для быстрых и грязных приложений, но быстро ломается при применении к реальным решениям (по моему опыту, по крайней мере).
Так что же произойдет, если вы используете модель сдерживания и все ваши свойства будут делегированы объекту Model, который находится в состоянии в вашей ViewModel, и характер модели изменится? Или Модель не делает все, что вам нужно. Факт заключается в том, что ViewModel предназначен для адаптера, который дает UI то, что ему нужно для работы. Редко должны быть отношения 1: 1 с Моделью, но я знаю, что это происходит.
Что произойдет, если через 6 месяцев вы решите воспользоваться услугой REST вместо WCF? Теперь у вас нет поддержки INPC в вашей модели, потому что вы не имеете дело с автоматически генерируемыми прокси-классами. Хотя это и не так ощутимо, как меняется пользовательский интерфейс, здесь применимы те же идеи, и именно поэтому шаблоны разделяют модель.
Мой совет: следуйте своему первому инстинкту и используйте AutoMapper для отображения данных, содержащихся в вашем объекте Model, в вашу ViewModel и наоборот. AutoMapper позволяет очень легко справляться с проблемами несоответствия импеданса, с которыми вы можете столкнуться, и дает вам единое место для внесения изменений в случае изменения одной или другой стороны договора.
2
То, что у вас есть, является объектной моделью, и в этом случае наличие событий, обратных вызовов и т. Д. Совершенно законно. Я бы сказал, что ваш OrderViewModel содержит коллекцию объектов OrderLineViewModel. Дочерние объекты могут содержать ссылку на родителя (OrderViewModel) и извлекать оттуда выбранного клиента.
3
Во-первых, именно ViewModel, а не Model, реализует бизнес-правила и проверку. Во-вторых, такие правила существуют, чтобы предоставить пользователю интерактивный опыт. Независимо от того, какие правила вы добавили в ViewModel, вы всегда должны выполнять проверки целостности на сервере, чтобы убедиться, что пользователю разрешено выполнять запрошенную операцию и что данные действительны для сохранения.
Что касается вопроса о правилах делового обхода, я бы сказал, нет. Я стараюсь применять столько бизнес-правил в клиентском приложении, сколько имеет смысл. Во-первых, это улучшает взаимодействие с пользователем и уменьшает сетевой трафик, необходимый клиенту. Я придерживаюсь одного практического правила: никогда не позволяю пользователю сохранять недопустимый объект. Примечание: неточные или неполные данные не совпадают с недействительными. Неверные данные вызывают исключения.