Silverlight 4 WCF RIA Services и MVVM не так просты - PullRequest
8 голосов
/ 29 апреля 2010

[Отказ от ответственности: я разработчик ASP.NET MVC]

Привет

Я ищу рекомендации по внедрению шаблона MVVM с помощью WCF RIA в Silverlight 4.

Я не собираюсь использовать MEF IoC для определения местоположения моих ViewModels. Я хотел бы знать, как применить шаблон MVVM с Silverlight 4 и WCF RIA.

Я не хочу использовать другие вещи, такие как Prism или MVVM Light. В Интернете я нашел много примеров, показывающих, как замечательно перетаскивать источник данных на представление и работа выполнена (это напоминает мне о моих первых разработках VB6).

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

  1. Могу ли я использовать сгенерированные метаданные в качестве модели? Было бы проще использовать его, если бы я все писал с нуля.

  2. Как я видел, единственный способ получить данные - это через DomainContext или через прямую привязку в представлении (локальный ресурс). Я не хочу прямой привязки в представлении, совсем не тестируемой. С другой стороны, я не могу использовать DomainContext, он не раскрывает ни одной сущности !!! Все, что у меня есть, это EntitySet, который я могу привязать к сетке данных. Как связать одну сущность с DataForm из ViewModel?

  3. Как обновить модель в базе данных?

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

Пожалуйста, помогите мне понять, как это сделать хорошо. Или, может быть, я должен отказаться от WCF RIA и сделать это с WCF с нуля?

Что вы думаете?

Ответы [ 4 ]

9 голосов
/ 29 апреля 2010

Вас может заинтересовать эта сессия . В нем объясняется, как использовать шаблон MVVM с RIA WCF Services.

4 голосов
/ 23 июня 2010

Несколько случайных ответов ...

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

MVVM требует, чтобы вы понимали роли. «Представление» - это ваш XAML и код. Выделенный код должен обрабатывать события из пользовательского элемента управления, но это немного больше.

ViewModel содержит данные, к которым будет привязан пользовательский элемент управления. Как правило, ViewModel привязывается к View как его DataContext, так что все в форме может связываться со свойствами в ViewModel. ViewModel должен реализовывать INotifyPropertyChanged и вызывать события изменения свойств для каждого свойства, к которому привязана форма.

Возможно, вы захотите создать коллекцию ObservableCollection, используя EntitySet в качестве источника. Это будет обрабатывать INotifyCollectionChanged для привязки данных. Если сущности в EntitySet также обрабатывают INotifyPropertyChanged, то вы в хорошей форме для привязки данных для коллекций.

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

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

Я не смотрел финальную версию RIA Services, но бета-версия меня не сильно впечатлила. Я предпочел бы иметь хорошие классы сущностей, определенные на сервере, и поделиться ими с проектом Silverlight. Тем не менее, это не так просто настроить, и требует некоторого нетривиального WCF, который не зависит от ссылок на сервисы. (Окончательный выпуск RIA Services, возможно, уже кое-что исправил, но ссылка на собственный сервис WCF в Silverlight довольно злая, в основном потому, что он не создает автоматически воссозданные сгенерированные классы и жестко кодирует URI для службы на стороне сервера. .)

Метаданные были еще одной проблемой в бета-версии RIA Services. Атрибуты метаданных проще прикрепить непосредственно к вашему классу DataContract и отдельным свойствам DataMember, если вы управляете источником сущности. Опять же, это может означать, что вы не используете RIA Services. Написание отдельного класса метаданных, как это требовалось для беты RIA, не было хорошим решением.

В итоге я не использовал RIA Services для Silverlight 3 и не пожалел об этом. Вот отличная статья о WCF и Silverlight . Несмотря на то, что в нем написано Silverlight 2, он все еще на цели для любого выпуска Silverlight.

Я рекомендую MVVM Light. Источник доступен на Codeplex, если это проблема. Он обеспечивает поддержку обмена сообщениями и командования, а также ViewModelLocator; хотя для понимания последнего требуется немного усилий, это действительно хорошее расширение базовой модели MVVM.

Надеюсь, это поможет .....

4 голосов
/ 23 июня 2010

Я нашел этот пост полезным:

http://www.astaticstate.com/2010/04/silverlight-4-using-mvvm-patter-ria.html

2 голосов
/ 17 августа 2010

Просто подумал, что дам вам знать о проекте, над которым я работаю - только что закончился наш первый релиз. Предоставляет отличный простой способ обратиться к MVVM для служб Silverlight + RIA. Упрощает многие вещи MVVM и предоставляет некоторые дополнительные функции, подобные контроллеру, с классом Notifications. http://slmvvms.codeplex.com/

...