2014-01-25 4 views
0

В настоящее время у меня есть несколько ViewModels в моем приложении WPF, которое требует данных из службы WCF. В настоящее время каждый ViewModel хранит ссылку на (другую) служебную программу. Проблема в том, что WCF не закрывается изящно (сервер сообщает о неожиданном закрытии соединения) при выходе приложения, и если пользователь простаивает в течение длительного времени, время соединения заканчивается.Доступ к WCF в ViewModel

Я думал о двух различных способов использования WCF в моем приложении:

  1. Создание serviceproxy внутри ViewModel и доступа к данным в использовании() заявление, так что я держу только соединение открытые на короткие промежутки времени.

  2. Используйте одноэлементный код WCF, доступный для всех видов ViewModels для каждого вызова.

Проблема с (1) является то, что я сделал звонки в WCF методов CanExecute для определения кнопки, если включена или выключена на моем GUI. Я обеспокоен тем, что сделать так много прокси-серверов будет дорогостоящим и медленным.

Проблема, которую я вижу с (2), является той, которую я уже замечаю: если соединение WCF простаивает в течение длительного периода времени, время истекает, и прокси-сервер ошибочен. Это означает еще большую обработку ошибок.

Если у кого-то хороший образец для такого доступа к данным, я был бы признателен за любую проницательность.

EDIT: Я понимаю, что использование WCF - плохая идея для CanExcute. Если это вызовет проблемы, я изменю его, но сейчас это приложение имеет 3 пользователя. Я просто ищу хороший способ получить доступ к сервису из моей модели ViewModel, которая предотвращает разъединения и также может быть проверена.

+1

Предлагаю создать класс-обертку для вашего обслуживания. Обертка должна отвечать за обработку проверки/повторного открытия соединения и т. Д., Поэтому вам нужно будет только один раз написать этот код. – McGarnagle

+0

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

ответ

1

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

Что нужно, чтобы сервер сигнализировал клиенту (клиентам), что изменения в CanExecutes. Например: когда один клиент удаляет клиента, сервер может поднять «клиентское» событие, к которому могут присоединиться другие клиенты, отключив их кнопку «Редактировать», если у них есть этот конкретный клиент на своем экране.

Поиск в Интернете для публикации/подписаться на помощь в реализации этого шаблона. Вы можете скачать «публиковать подписываться рамки» с использованием WCF с сайта IDesign.net здесь: http://www.idesign.net/Downloads/GetDownload/2032

+0

Я согласен с тем, что CanExecute является проблемой. Но в остальном мой главный вопрос касается того, как я должен предоставлять доступ к данным WCF из моей модели ViewModel, что позволяет управлять соединениями надлежащим образом, а также позволяет мне тестировать объекты ViewModels. – Killnine

+0

Вы также попросили хороший шаблон :-) –

+0

Вы сделали тесты производительности, создающие новые прокси? Я обнаружил, что выполнение «нового ServiceClient» для каждого вызова не так дорого. Кажется, есть какой-то механизм кэширования за сценами WCF ... –

0
  1. Создание ФОС вызова в CanExceute плохая практика
  2. Всегда клиент должен закрыть соединение раз операция выполняется, соединение не должен быть открыт слишком долго
  3. Если несколько клиентов, но все они хотят показать одно и то же состояние, то сделайте сервер как singleTon
  4. Если вы хотите получить уведомление из-за некоторых изменений на сервере, используйте wcf обратные вызовы, когда когда-либо происходят изменения в сервере, сервер будет звонить клиенты
Смежные вопросы