Как перехватить создание класса WCF

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

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

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

4 ответа

Я не совсем понимаю, что вы пытаетесь сделать - вы хотите отправить 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:

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

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

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

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

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

Другие вопросы по тегам