Как перехватить создание класса 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