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

C# WCF客户端对象反序列化通知,c#,wpf,wcf,.net-4.0,C#,Wpf,Wcf,.net 4.0,我有一个WPF客户端应用程序,通过对远程WCF服务的引用来接收对象。WCF服务引用是通过Visual Studio的“添加服务引用…”生成的 每次从WCF服务接收/反序列化对象时,我都希望执行一段代码。该对象需要已经被反序列化,以便我可以读取它的属性/调用方法。此解决方案将是全局的,而不是我需要添加到每个WCF服务调用中的内容。您可以使用OnDeserialized属性: 从迈克最初的回答开始,我想出了以下解决方案 背景 客户端通过WCF服务从服务器提取数据 WCF服务引用是由Visual St

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


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

您可以使用OnDeserialized属性:


从迈克最初的回答开始,我想出了以下解决方案

背景

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

    我知道这打破了一些面向对象和责任的规则,但是解决方案很短,很简单,并且适合我当前和预期的未来需求,所以我选择了它。当需要在每个客户端反序列化上执行重要的逻辑时,此解决方案不太实用

    [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;
                                       };
            }
        }
    }
    
    按键

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

  • 我不明白这个问题。您是否正在寻找有人这样做的代码示例?你能更具体地说明你的意图吗?我想让这个问题尽可能一般化。我正在寻找关于在哪里可以挂接到WCF工作流(某个地方的属性?行为?)的指导。具体来说,我想订阅进入系统的每个对象的INotifyPropertyChanged.PropertyChanged事件,以便确定用户是否修改了任何传入对象。我看到了。看看Mike的答案……它可能正是您想要的。这与我想要的很接近,但需要将代码放在通过线路发送的类型中(我使用的是“在引用的程序集中重用类型”)。如果代码在此共享代码中,则它无权访问我的WPF/客户端应用程序中的任何信息。您是否控制服务代码以及客户端?如果是,您可以将数据传输对象(和契约)放置在它们自己的程序集中,并直接在客户机上引用它,而不是在VisualStudio中使用Add Service reference。您可以使用它来生成客户机配置(这通常有点容易出错)。但在引用的程序集中使用合同类型的ChannelFactory。或者,如果您无权访问服务代码,您可以使用“添加服务引用”生成代理类,然后将代码粘贴到您自己的类中,并添加相关方法来处理反序列化事件。不幸的是,我无法使用代理生成和调整代理,因为我需要能够从service1接受对象并通过service2将其发送回(因此,“重用类型”选项)我明白了。我想你可以定义一个共享代码引用的接口,并在WPF客户端中实现它,也许可以使用IoC模式将客户端的类型注入共享代码中,但这一切都变得有点混乱……对我来说,这是一个很好的、实用的解决方案。如果你自己托管服务,应用程序会吗。当前的st我会是空的吗?