0

我有一个未使用服务引用的 wcf 服务。类和接口在客户端服务器引用的 dll 中定义。与服务器的通信使用从 ClientBase 派生的类。

我想在客户端拦截 wcf 的默认对象创建,以便我可以提供实现 INotifyPropertyChanged 的​​子类型(由城堡动态代理创建)。

NHibernate 返回一个实现 INotifyPropertyChanged 的​​类的基本相同的想法仅用于 wcf。

4

4 回答 4

1

我不完全理解您要做什么-您想将 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 中编写和处理消息检查器的一些博客文章:

于 2009-11-30T20:00:08.090 回答
0

看看 Castle WCF 设施。我很确定您可以扩展它以添加 INotifyPropertyChanged。该设施使用 DynamicProxy 来生成您的代理。

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

于 2010-05-14T20:22:56.207 回答
0

Microsoft 的SVCUTIL.EXE可以通过正确实现 INotifyPropertyChanged 自动生成您的代理数据类。查看 enableDataBinding 参数。这不完全是您所要求的,但无论如何可能会解决您的需求。

于 2010-03-01T22:05:41.043 回答
0

您是在谈论从您的 ChannelFactory 中拦截 CreateChannel 旋转的对象吗?

您可以覆盖 BaseChannelFactory 并修改它返回的 ClientBase 对象吗?

于 2009-12-01T11:23:54.803 回答