我有一个未使用服务引用的 wcf 服务。类和接口在客户端服务器引用的 dll 中定义。与服务器的通信使用从 ClientBase 派生的类。
我想在客户端拦截 wcf 的默认对象创建,以便我可以提供实现 INotifyPropertyChanged 的子类型(由城堡动态代理创建)。
NHibernate 返回一个实现 INotifyPropertyChanged 的类的基本相同的想法仅用于 wcf。
我有一个未使用服务引用的 wcf 服务。类和接口在客户端服务器引用的 dll 中定义。与服务器的通信使用从 ClientBase 派生的类。
我想在客户端拦截 wcf 的默认对象创建,以便我可以提供实现 INotifyPropertyChanged 的子类型(由城堡动态代理创建)。
NHibernate 返回一个实现 INotifyPropertyChanged 的类的基本相同的想法仅用于 wcf。
我不完全理解您要做什么-您想将 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 中编写和处理消息检查器的一些博客文章:
看看 Castle WCF 设施。我很确定您可以扩展它以添加 INotifyPropertyChanged。该设施使用 DynamicProxy 来生成您的代理。
http://www.castleproject.org/container/facilities/trunk/wcf/index.html
Microsoft 的SVCUTIL.EXE可以通过正确实现 INotifyPropertyChanged 自动生成您的代理数据类。查看 enableDataBinding 参数。这不完全是您所要求的,但无论如何可能会解决您的需求。
您是在谈论从您的 ChannelFactory 中拦截 CreateChannel 旋转的对象吗?
您可以覆盖 BaseChannelFactory 并修改它返回的 ClientBase 对象吗?