WCF到WPF -数据契约到模型

本文关键字:契约 模型 数据 WPF WCF | 更新日期: 2023-09-27 18:09:37

这可能是一个奇怪的问题,但它一直困扰着我。

我正在研究WCF服务上的数据契约对象和WPF客户端的数据模型之间的转换。

我认为有三个选择:

  1. 在WPF和WCF两端创建对象,并有一个方法将一个对象转换为另一个对象。
  2. 创建一个对象,并在两侧使用。
  3. 在WPF端创建一个对象,封装从WCF服务返回的DataContract对象。

现在我更喜欢1。然而,我想知道是否有任何我没有预见到的失败。

WCF到WPF -数据契约到模型

节选自"Prism 5 for WPF""The Model class ":

通常,模型表示应用程序的客户端域模型。它可以根据应用程序的数据模型和任何支持的业务和验证逻辑定义数据结构。该模型还可能包括支持数据访问和缓存的代码,尽管通常为此使用单独的数据存储库或服务。通常,模型和数据访问层是作为数据访问或服务策略(如ADO)的一部分生成的。. NET实体框架、WCF数据服务或WCF RIA服务

通常,模型实现了使绑定到视图变得容易的工具。这通常意味着它通过INotifyPropertyChanged和INotifyCollectionChanged接口支持属性和集合更改通知。表示对象集合的模型类通常派生自ObservableCollection类,该类提供了INotifyCollectionChanged接口的实现。

模型还可以通过IDataErrorInfo(或INotifyDataErrorInfo)接口支持数据验证和错误报告。IDataErrorInfo和INotifyDataErrorInfo接口允许在值发生变化时通知WPF数据绑定,以便更新UI。它们还支持UI层中的数据验证和错误报告。

如果你的模型类没有实现所需的接口怎么办?

有时候你需要处理不实现INotifyPropertyChanged、INotifyCollectionChanged、IDataErrorInfo或INotifyDataErrorInfo接口的模型对象。在这些情况下,视图模型可能需要包装模型对象并向视图公开所需的属性。这些属性的值将由模型对象直接提供。视图模型将为它所公开的属性实现所需的接口,以便视图可以轻松地与它们进行数据绑定。

我从这里收集到,Word from On High介于#1(直接使用它们)和#3(使用包装器)之间,其中WCF代理类是模型,包装器类是您的视图模型。根据MVVM模式,模型(代理)类应该封装业务逻辑,而视图模型类应该封装代理类并合并表示逻辑。

只有在需要代理类支持额外接口(如IDataErrorInfo)的情况下,您才能在代理类周围添加额外的模型包装器。

通常最好为您从WCF数据契约中填充的视图定义模型。一些好处:

  1. 你的UI将不依赖于数据契约,它只会对它的模型感兴趣,它可以通过任何方式填充。

  2. 你的UI模型可以包含为特定视图服务的计算属性,所以最好将它们与数据契约分开。

您在使用MVVM吗?我建议让视图模型直接或通过包装器使用数据契约。这将使您能够将视图与数据契约解耦。View不应该包含任何对Data Contract的引用