Рекомендации по асинхронным вызовам в .NET Prism4 WVVM + WPF - PullRequest
2 голосов
/ 05 июля 2011

В настоящее время я начинаю работу с платформой .NET Prism для разработки приложения WPF. Одна вещь, которую я не могу определить, - это лучший способ выполнения асинхронных вызовов службы WCF или базы данных? Причина в том, что я не хочу, чтобы вызов WCF / DB блокировал поток пользовательского интерфейса, из-за чего пользовательский интерфейс просто зависал до завершения операции.

Насколько я понимаю, я должен следовать архитектуре:

View (WPF) <=> View Model <=> Application Services <=> DB/WCF

Реализовать ли я асинхронное поведение в модели представления, используя что-то вроде AsyncDelegateCommand ? Если я это сделаю, то я не смогу поддерживать какое-либо состояние в службах приложений, поскольку установка любого состояния должна выполняться в потоке пользовательского интерфейса (если только нет способа обойти это).

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

Я кратко рассмотрел эталонную реализацию Prism StockTrader, и они, похоже, ничего не делают асинхронно. Я чувствую, что это должно быть очень распространенной проблемой, и должны быть некоторые лучшие методы, чтобы справиться с этим.

1 Ответ

3 голосов
/ 05 июля 2011

Я не нашел ничего в Интернете с точки зрения «Лучшей практики».

Лично я считаю, что следующая установка хороша: View <= BINDING => ViewModel <==> DataRepository/DataAccessLayer (Async Calls)

Что касается сохранения вашей ViewModel всинхронизируя с DAL, вы можете сделать несколько вещей в зависимости от того, какие данные необходимо синхронизировать:

  • Предоставьте ReadOnlyObservableCollection<T> s для коллекций ваших моделей и управляйте их вспомогательными коллекциями внутри (изнутриDAL).
  • Для отдельных элементов верните новый экземпляр элемента и загрузите элемент в асинхронное завершенное событие.
  • Кроме того, научитесь любить EventAggregator (это не слишком сложно - хотяЕсть некоторые улучшения в сети - Расширение EventAggregator ).Это очень помогает.Лучше использовать это, чтобы объявить «рабочие» и «завершенные» события.

По сути, поскольку Service Reference Generator помогает создавать асинхронные вызовы для вас, просто поработайте с этим и используйте свой DataRepository / DAL дляуправлять данными, внутренне выставляя ссылки на ваши ViewModels и EventAggregator, чтобы объявить Работающий / Завершенный.


Я должен также сказать следующее ... вы можете сделать свой DAL полностью синхронным и иметь все асинхронные вызовы для/ из него в ViewModel, так как вы, вероятно, захотите выставить некоторый тип свойств "IsWorking / Completed", чтобы представление могло знать, что происходит или что это сделано.Я думаю, что ключ заключается в том, чтобы вы поместили всю асинхронность на один слой (но не на View).Выполнение этого на слое ViewModel делает его более трудоемким при создании асинхронных вызовов, но это намного чище.Вы DAL только делаете вещи синхронно и не должны публиковать завершенные / рабочие события.На самом деле, я бы сказал, что это более распространенный подход.

...