2010-08-05 1 views
15

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

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

+3

Рассмотрите возможность превратить это в вики сообщества, чтобы каждый мог редактировать. –

+0

Я не думаю, что это как com-wiki. Ответчик заслуживает репутацию этого хорошего вопроса. – Shimmy

ответ

25

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

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

Clean-Up Идеи:

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

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

Для смешиваемости:

  1. РеФеРаТ Услуги/Запрос Реализации к интерфейсу.
  2. Создайте 2 класса для каждого класса обслуживания Реализация (1 для проектирования, 1 для производства)
  3. В пределах каждой вашей модели ViewModel реализуйте свой собственный класс обслуживания (используйте IsInDesignMode) для создания реализаций Blendable Service при необходимости.
  4. Используйте переменную Static для хранения домена DomainContext в классе Implmentation Service.
  5. Добавить DispatcherHelper.Initialize() в конструктор ViewModels, но только в режиме разработки. Blend не загружает приложение при загрузке страницы, и это работает вокруг этого.

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

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

Для Просмотры:

  1. Всегда Свяжите корень локатора объекта.
  2. Старайтесь поддерживать логику кода только в макете или пользовательской логике пользовательского интерфейса. Избегайте ссылок на ViewModel.

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

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

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

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

РИА DomainServices:

  1. Реализация любого входа в систему функции сохранения изменений, а не обновление/вставки/удаления логики.
  2. Во время вставки, обновления, удаления функций, если вам нужно обратиться к другому объекту через свойство навигации, сначала проверьте EntityStatus или загрузите объект из другого Контекста, чтобы предотвратить конфликты EntityStatus.

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

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

Для Entity Framework:

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