【问题标题】:How to intercept WCF class creation如何拦截 WCF 类的创建
【发布时间】:2009-11-30 19:22:24
【问题描述】:

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

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

NHibernate returning a class implementing INotifyPropertyChanged 背后的想法基本相同,仅适用于 wcf。

【问题讨论】:

    标签: .net wcf dynamic-proxy


    【解决方案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 中编写和处理消息检查器的博客文章:

    【讨论】:

      【解决方案2】:

      你是说从你的 ChannelFactory 中截取 CreateChannel 启动的对象吗?

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:

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

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

          【讨论】:

            猜你喜欢
            • 2014-09-30
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-06-28
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多