gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 20:06:53 24 4
gpt4 key购买 nike

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

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

最佳答案

从 Mike 的初始回复开始,我得出了以下解决方案。

背景

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

预警

我知道这违反了一些面向对象和责任的规则,但是这个解决方案非常简短,非常简单,并且符合我当前和预期的 future 需求,所以我选择了它。当每个客户端反序列化都需要发生重要逻辑时,此解决方案不太实用。

[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 bool 值。
  2. 检查 Application.Current 是否为 null 可确保代码仅在客户端而非服务器端运行。

关于c# - WCF 客户端对象反序列化通知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9218928/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com