В настоящее время у меня есть несколько ViewModels в моем приложении WPF, которое требует данных из службы WCF. В настоящее время каждый ViewModel хранит ссылку на (другую) служебную программу. Проблема в том, что WCF не закрывается изящно (сервер сообщает о неожиданном закрытии соединения) при выходе приложения, и если пользователь простаивает в течение длительного времени, время соединения заканчивается.Доступ к WCF в ViewModel
Я думал о двух различных способов использования WCF в моем приложении:
Создание serviceproxy внутри ViewModel и доступа к данным в использовании() заявление, так что я держу только соединение открытые на короткие промежутки времени.
Используйте одноэлементный код WCF, доступный для всех видов ViewModels для каждого вызова.
Проблема с (1) является то, что я сделал звонки в WCF методов CanExecute для определения кнопки, если включена или выключена на моем GUI. Я обеспокоен тем, что сделать так много прокси-серверов будет дорогостоящим и медленным.
Проблема, которую я вижу с (2), является той, которую я уже замечаю: если соединение WCF простаивает в течение длительного периода времени, время истекает, и прокси-сервер ошибочен. Это означает еще большую обработку ошибок.
Если у кого-то хороший образец для такого доступа к данным, я был бы признателен за любую проницательность.
EDIT: Я понимаю, что использование WCF - плохая идея для CanExcute. Если это вызовет проблемы, я изменю его, но сейчас это приложение имеет 3 пользователя. Я просто ищу хороший способ получить доступ к сервису из моей модели ViewModel, которая предотвращает разъединения и также может быть проверена.
Предлагаю создать класс-обертку для вашего обслуживания. Обертка должна отвечать за обработку проверки/повторного открытия соединения и т. Д., Поэтому вам нужно будет только один раз написать этот код. – McGarnagle
Вы можете создать класс, обрабатывающий запрос службы из модели просмотра, этот класс также сохраняет время простоя (запрос не приходит из какой-либо модели представления) и устанавливает предел для этого времени простоя, если запрос не пришел, а затем закройте соединение. – Firoz