2015-02-10 3 views
1

В ФОС дуплексной проекте я работаю, прокси создается и открывается с помощью следующих 3 строки:WCF CallBack логика объекта

InstanceContext context = new InstanceContext(new MyCallbackObjectImplementingCallbackContract()); 

_proxy = new ServiceClient(context); 

_proxy.Open(); 

у меня есть несколько вопросов здесь:

  1. Lets говорят, что мой контракт обратного вызова имеет всего 3 метода (рабочий контракт) и мой класс обратного вызова, вместо того, чтобы просто реализовать эти 3, у меня есть еще 10 методов. Я нашел путем отладки на стороне сервера, когда OperationContext.Current.GetCallbackChannel<IMyCallbackContract>() называется Возвращаемый объект имеет только методы с атрибутом 'OperationContract', а не весь объект. Какая магия за кулисами. Кроме того, не плохой дизайн иметь кучу дополнительных (не контрактных реализаций) методов в классе обратного вызова, если да, какое влияние это может иметь?
  2. _proxy.open() метаданные говорят, что объект переходит из созданного состояния в открытое состояние. Я не совсем понимаю, что это значит?

ответ

0

Вопрос №1: Да, WCF ищет методы, отмеченные атрибутом OperationContract. Он создает прокси, используя старый механизм Remoting RealProxy/TransparentProxy. В принципе, WCF ищет операции в интерфейсе контракта, а не в классе, который реализует интерфейс. Он также проксирует интерфейс контракта, а не класс реализации.

Что касается вопроса дизайна, все зависит. Пока другие методы помогают операционным методам выполнять свой контракт, нет проблем. Но если другие методы реализуют различную ответственность, то, как это звучит, такая конструкция нарушает принцип единой ответственности.

Вопрос №2: в WCF, прокси-каналы наследуют CommunicationObject. Этот объект не является апатридом, он отслеживает состояние связи по каналу. Кроме того, он может проводить сеанс на удаленной стороне, что является дорогостоящим и ограниченным ресурсом. По этим причинам объект связи следует обрабатывать так же, как подключение к базе данных: откройте его, выполните операцию, затем Close() или Abort(). Вы можете найти более подробную информацию в this MSDN topic.

Смежные вопросы