Хорошая архитектура для потребления веб-сервиса REST в приложении MVVM для Windows Phone 7?

Я испытываю немного затруднений, выбирающих лучший способ получить данные от веб-сервиса до UI.

Учитывая асинхронную природу WebClient, как Вы создали бы это?

  • Модель использует WebClient, чтобы говорить с веб-сервисом
  • ViewModel просит у модели данные
  • Представление связано с данными к ViewModel

На Асинхронном полном событии я должен вытащить те данные назад из модели в ViewModel, это вещи, о которых я думал.

  1. Я мог запустить событие в Модель, на которую подписывается ViewModel.
  2. Я мог, возможно, сделать что-то с раздаванием обратных вызовов?
  3. Или я должен делать второй уровень событий INotifyPropertyChanged между ViewModel и Моделью?
  4. Или я - очень запутанный и полностью неправильно понимающий MVVM?
8
задан Will 5 July 2010 в 21:22
поделиться

2 ответа

Это зависит от того, насколько пуристом вы хотите быть в отношении MVVM.

Вы можете рассматривать сам API как свою модель, и в этом случае ViewModel имеет WebClient, а после завершения Async вы должны установить свои свойства (и они, в свою очередь, активируют PropertyChanged из своих установщиков).

Или у вас может быть локальная Модель, в которой есть код WebClient (как это похоже на вас). В этом случае мой личный подход заключался бы в том, чтобы иметь событие «ModelUpdated», которое запускается из события завершения Async. (Ваш вариант 1).

Модель ViewModel может прослушивать это событие и либо запускать PropertyChanged (null) , чтобы View запрашивал ВСЕ свойства, либо запускать несколько событий PropertyChanged. Помните, что вы не ограничены запуском PropertyChanged из ваших сеттеров. Ничто не мешает вам иметь такой метод, как

private void FireMultipleProperties(){
NotifyPropertyChanged("Property1");
NotifyPropertyChanged("Property2");
NotifyPropertyChanged("Property3");
}

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

4
ответ дан 5 December 2019 в 23:13
поделиться

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

Например, если у вас есть модель продукта и ProductListViewModel с набором продуктов и, возможно, командой поиска, тогда вы должны ввести ProductSearchService (или ProductLoadService, который загружает все продукты). Затем я передал бы этот ProductSearchService в ваш конструктор ProductListViewModel (внедрение зависимостей) и позволил бы вашей модели ViewModel управлять извлечением продуктов (объектов вашей модели), вызывая соответствующие методы службы и загружая ответ.

  • ProductListService возвращает список продуктов (моделей)
  • ProductListViewModel использует ProductListService для получения продуктов
  • ProductListView привязывается к ProductList ObservableCollection в ProductListViewModel.

Этот шаблон по существу напоминает модель-представление-контроллер, где модель представления берет на себя больше функций контроллера.

Поскольку вы упомянули веб-службы на основе REST, у меня есть пример сообщения в блоге об использовании результатов MVC 2 JSON в качестве уровня обслуживания для приложения Win Phone 7: Управляемые данными приложения Win Phone 7 с сервисами MVC 2 JSON

1
ответ дан 5 December 2019 в 23:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: