WPF MVVM WCF 客户端/服务器架构
Posted
技术标签:
【中文标题】WPF MVVM WCF 客户端/服务器架构【英文标题】:WPF MVVM WCF client/server architecture 【发布时间】:2012-07-11 02:04:34 【问题描述】:我想构建一个基本的 wpf/mvvm 应用程序,它使用 WCF 从服务器获取数据并允许客户端显示/操作(使用 CRUD 操作)这些数据。
到目前为止,我为架构考虑过类似的事情:
“全局”模型层,用于实施验证、研究标准以及 INotifyPropertyChanged 和服务合同 一些服务层,主要是实体框架4,实现模型层的合同,允许我访问和操作数据。 请注意,我还想要一个离线数据源,比如 XML 或其他内容,因此还有另一个服务(我计划使用一些 DI/IoC) WCF 层 客户端数据存储的额外层? ViewModel我对 Views/ViewModel 部分很清楚,但我无法弄清楚模型、WCF 和 viewmodel 之间的关系。
我的问题是:
-
我应该如何处理 EF 生成的模型?摆脱它然后走
对于代码优先方法,手动进行映射
数据库?
对于 WCF 数据传输,我应该有关系
我的模型中的属性,即产品有客户而不是
客户ID ?
我是否应该在 WCF 和
ViewModel,用于存储和操作数据还是最好的
练习直接将 ViewModel 插入 WCF 吗?
欢迎任何其他关于这种架构的提示...
【问题讨论】:
您可能想阅读我对***.com/q/10437241/50079的回答 @Jon :您的回答确实很棒,谢谢。但是我对模型部分还不是很清楚,cf。我对 ken2k 的回答 【参考方案1】:对于 3 层 WPF 应用程序的架构有不同的解决方案,但这里有一种可能性:
1+2) 一种解决方案是创建代表您的客户端应用程序实际需要的“中间”对象。 例如,如果您的应用程序需要显示有关产品的信息以及相关的客户名称,您可以构建以下对象:
public MyProduct
// Properties of the product itself
public int ProductID get; set;
public string ProductName get; set;
...
// Properties that come from the Customer entity
public string CustomerName get; set;
然后您可以公开一个无状态的 WCF 服务,该服务从一个 ID 返回您的产品:
[ServiceContract]
MyProduct GetProductByID(int productID);
在您的应用程序的服务器端(即您的服务的实现),您可以通过 EF 查询数据库(每次调用一个上下文)返回一个 MyProduct
实例构建:
public MyProduct GetProductByID(int productID)
using (DBContext ctx = new ....)
return from p in ctx.Products
where p.ID == productID
select new MyProduct
ProductID = p.ID,
ProductName = p.Name,
CustomerName = p.Customer.Name // Inner join here
;
3) 在 WCF 服务和 ViewModel 之间添加额外的层可能被认为是过度工程。恕我直言,可以直接从 ViewModel 调用 WCF 服务。 WCF 生成的客户端代理代码具有模型的实际作用(至少是模型的一部分)。
编辑:
为什么 MyProduct 应该引用 CustomerName 而不是 客户。就我而言,客户将拥有许多我可以使用的属性 和。这个“映射”是不是太贵了?
您可以使用实际的实体。但在客户端,由于它是 3 层架构,您无法通过导航属性访问数据库。如果有一个嵌套的Customer
属性(Customer
类型),客户端将可以访问theProduct.Customer.Products
,这没有任何意义,因为您不能以这种方式延迟加载实体(客户端没有数据库上下文)。
扁平化的“中级”POCO 比 IMO 简单得多。不存在性能问题,映射简单明了,与 DB 请求时间相比,此特定操作的 CPU 使用率非常小。
【讨论】:
谢谢。您的回答对我有所帮助,但我仍然不清楚为什么 MyProduct 应该引用 CustomerName 而不是 Customer。就我而言,客户将拥有许多我可以使用的属性。这个“映射”是不是太贵了?【参考方案2】:首先,一些一般信息:Jason Dollinger available at Lab49 有一个关于 MVVM 的非常好的教程
编辑 该视频涵盖了构建 WPF 应用程序时的大部分需求。 还涵盖了依赖注入和与 WCF 的连接(但 谈论 WCF 时不深入,但用一种非常强大的方式 在这里提出好的解决方案)
他开发的源码也是available here
在我看来,与 MVVM 有关系的每个人都应该看到它!
=> 1. 我应该如何处理EF生成的模型?摆脱它并采用代码优先的方法,手动与数据库进行映射?
AutoMapper 可以在这里提供帮助。 Codeplex of AutoMapper 您的问题似乎非常适合这个!
=> 2. 对于 WCF 数据传输,我的模型中是否应该有关系属性,即 Product 有 Customer 而不是 CustomerId ?
不要弄乱模型! productid 是订单的一部分,订单有一个 customer-id。 坚持这一点。在您的服务层中,您可能最终会得到 id。 因为您可能不会在这里更改产品或客户。如果你这样做(和我的 订单示例不适合),您可以传输动态数据,而不是静态数据。
=> 3. 我是否应该在 WCF 和 ViewModel 之间增加一层,用于存储和操作数据,还是直接将 ViewModel 插入 WCF 是最佳做法?
在大多数情况下,我有一个服务层,它在构造函数中注入到我的视图模型中。 这可以假设为另一层,因为它处理 WCF 客户端部分和 处理服务器端的“更改”事件。 (行更改、新行、删除行等)
编辑 如果您必须调度您的服务层事件,则更容易拥有 WCF 和 ViewModel 之间的那个小而轻的层。只要你有 to,你自然会想出这样一个层。
【讨论】:
谢谢。我已经听说过 Jason Dollinger 的教程,现在是时候观看了!以上是关于WPF MVVM WCF 客户端/服务器架构的主要内容,如果未能解决你的问题,请参考以下文章
如何在 WPF MVVM 应用程序中成功登录关闭 LoginView?
在不触发 OnPropertyChanged 的情况下更新 WPF DataGrid