Как перехватить создание класса WCF - PullRequest
0 голосов
/ 30 ноября 2009

У меня есть служба wcf, для которой я не использую ссылку на службу. Классы и интерфейсы определены в dll и клиент-серверной ссылке. Для связи с сервером используется класс, производный от ClientBase.

Я хочу перехватить создание объектов wcf по умолчанию на стороне клиента, чтобы я мог предоставить подтип, реализующий INotifyPropertyChanged (созданный динамическим прокси-замком).

По сути, та же идея лежит в основе NHibernate, возвращающего класс, реализующий INotifyPropertyChanged только для wcf.

Ответы [ 4 ]

1 голос
/ 30 ноября 2009

Я не совсем понимаю, что вы пытаетесь сделать - вы хотите отправить POCO с сервера на клиент: это означает, что вам нужно создать этот класс POCO, декорировать его как [DataContract] и украсить его члены, которые вы хотите сериализовать с [DataMember].

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

Так что я действительно не понимаю, как и где вы хотите подключиться.

Одна вещь, которую вы могли бы сделать, это создать инспектор сообщений на стороне клиента на основе

public interface IClientMessageInspector
{
    void AfterReceiveReply(ref Message reply, object correlationState);
    object BeforeSendRequest(ref Message request, IClientChannel channel);
}

, который перехватит событие «AfterReceiveReply», а затем вы возьмете сериализованный класс POCO, попадающий через провод, и преобразуете его в другой класс, который также реализует обработчики INotifyPropertyChanged.

См. Некоторые сообщения в блоге о том, как писать и обращаться с инспекторами сообщений в WCF:

0 голосов
/ 15 мая 2010

Взгляните на замок WCF. Я уверен, что вы можете расширить его, чтобы добавить INotifyPropertyChanged. Средство использует DynamicProxy для генерации ваших прокси.

http://www.castleproject.org/container/facilities/trunk/wcf/index.html

0 голосов
/ 02 марта 2010

Microsoft SVCUTIL.EXE может автоматически генерировать ваши прокси-классы данных с правильно реализованной INotifyPropertyChanged. Посмотрите на параметр enableDataBinding. Это не совсем то, что вы просите, но в любом случае может решить ваши потребности.

0 голосов
/ 01 декабря 2009

Вы говорите о перехвате объекта, который вращает CreateChannel из вашего ChannelFactory?

Вы можете переопределить BaseChannelFactory и изменить его объект ClientBase, который он возвращает?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...