WCF客户端对象反序列化通知

时间:2012-02-09 21:18:15

标签: c# wpf wcf .net-4.0

我有一个WPF客户端应用程序通过引用远程WCF服务接收对象。 WCF服务引用是通过Visual Studio的“添加服务引用...”生成的。

每次从WCF服务接收/反序列化对象时,我都希望执行一段代码。该对象需要已经反序列化,因此我可以读取它上面的属性/调用方法。这个解决方案是全局的,而不是我需要添加到每个WCF服务调用的东西。

2 个答案:

答案 0 :(得分:4)

从Mike的初步回复开始,我能够提出以下解决方案。

<强>背景

  1. 客户端通过WCF服务从服务器提取数据。
  2. WCF服务引用由Visual Studio生成,“引用程序集中的重用类型”,因此无法进行WCF代理操作。
  3. 当从WCF收到的任何对象上的任何属性发生更改时,需要修改客户端应用程序上的属性(这些对象实现INotifyPropertyChanged)
  4. <强>预警

    据我所知,这打破了一些面向对象和责任规则,但解决方案是如此简短,如此简单,适合我当前和预期的未来需求,所以这就是我的目标。当需要在每个客户端反序列化时发生重要逻辑时,此解决方案不太实用。

    [DataContract]
    public class DataTransferObject : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;
    
        [OnDeserialized]
        public void OnDeserialized(StreamingContext context)
        {
            dynamic app = Application.Current;
            if(app != null) //Prevents execution on server-side.  This code is meant to only execute at the client
            {
                PropertyChanged += (sender, args) =>
                                       {
                                           app.IsAnythingDirty = true;
                                       };
            }
        }
    }
    

    密钥

    1. 这可行的原因是动态关键字。你必须使用 dynamic关键字因为包含DTO的项目无法引用 UI项目由于循环引用。如果它无法引用UI项目,则编译器不会知道IsAnythingDirty布尔值。
    2. 检查Application.Current是否为null可确保代码仅在客户端运行,而不是在服务器端运行。

答案 1 :(得分:3)