Ответ 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. Это предотвратит случайное вытягивание объекта с помощью свойств навигации, в результате чего ваша автономная версия не будет обновлена.
- Создайте дополнительный контекст для поиска текущих значений во время логики обновления/интеграции.