Рекомендации MVVM-light + RIA Services

Я хотел бы начать сборку лучших практик MVVM-light (w/RIA Services). Есть ряд вещей, которые я нашел полезными передовыми методами или лучшими подходами, но хотел бы услышать от других, используя инструментарий MVVM-light, и посмотреть, что они нашли.

Пожалуйста, разместите свои лучшие практики в качестве ответов на этот вопрос.

Ответы

Ответ 1

Основное использование MVVM-Light

  • Intialize DispatcherHelper в файле App.cs. Функция Application_Startup.
  • Создать ViewModels из BaseClass
  • Всегда создавайте класс ViewModelLocator, который содержит все ваши модели просмотра и связан с вашим приложением Ресурсы
  • Используйте RelayCommands для отображения функций в вашем представлении
  • Узнайте, когда следует использовать диспетчер отправки.

Рекомендации по очистке:

  • При необходимости добавьте в ViewModel очистку DomainContext EntitySet on Cleanup()?
  • Вызовите функцию ViewModelLocator CleanupSomeVM(), чтобы очистить режимы просмотра, когда они больше не нужны в приложении.

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

Для гибкости:

  • Аннотация реализации служб/запросов к интерфейсу.
  • Создайте 2 класса для каждого класса Service Implementation (1 для Design, 1 для Production).
  • Внутри каждой вашей модели ViewModel реализуйте свой собственный класс обслуживания (используйте IsInDesignMode) для создания реализаций Blendable Service при необходимости.
  • Используйте переменную Static для хранения домена DomainContext в классе имплементации служб.
  • Добавьте DispatcherHelper.Initialize() в конструктор ViewModels, но только в режиме разработки. Blend не загружает приложение при загрузке страницы, и это работает вокруг этого.

Для добавленной бизнес-логики:

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

Для просмотров:

  • Всегда привязывать корень к объекту Locator.
  • Постарайтесь сохранить логику кода для макета или пользовательскую логику пользовательского интерфейса. Избегайте ссылок на ViewModel.

Для коллекций:

  • Используйте CollectionViewSource для коллекций в ваших моделях ViewModels с источником DomainContext EntitySet
  • Применить всю фильтрацию, сортировку и группировку логики в CollectionViewSource в вашей модели ViewModel.
  • После ServiceCalls вызовите .View.Refresh() на объекты CollectionViewSource, если необходимо, чтобы обновить интерфейс.

Для координации ViewModel (логика контроллера)

  • Использовать сообщения экономно, слишком сложно выполнить сложность.
  • Используйте классы NotificationMessage и PropertyChangedMessage для отправки/получения с помощью.

Для служб домена RIA:

  • Внедрение любого входа в функцию изменений persist, а не логика обновления/вставки/удаления.
  • Во время функций Insert, Update, Delete, если вам нужно ссылаться на другое Entity через свойство Navigation, сначала проверьте EntityStatus или загрузите объект из другого Контекста, чтобы предотвратить конфликты EntityStatus.

Для отладки/тестирования:

  • Проверьте окно вывода для ошибок привязки и исправьте их. Ошибки связывания прерываются молча пользователю, но ухудшают производительность приложения и ожидаемое поведение.
  • Создайте модульные тесты в Silverlight, чтобы проверить добавленную модель/бизнес-логику
  • Создайте проект Unit Test для проверки логики и функций на стороне сервера.

Для платформы Entity:

  • Сохранять соответствие 1-к-1 объектамContext для домена. Попытка разбить этот другой способ вызывает проблемы.
  • НЕ используйте атрибут [Композиция], если вы полностью не намерены тратить много времени на тщательное построение логики вставки, обновления и удаления.
  • Используйте отдельную службу для обслуживания пользовательских типов обратно к вашему клиенту RIA. Не добавляйте их в свой DomainService для объекта EntityFramework.
  • Выполните логику обновления/интеграции на стороне сервера (например, обновление других систем) в функции PersistChangeSet, а не в функциях Insert, Update, Delete. Это предотвратит случайное вытягивание объекта с помощью свойств навигации, в результате чего ваша автономная версия не будет обновлена.
  • Создайте дополнительный контекст для поиска текущих значений во время логики обновления/интеграции.