有关使用 WCF 服务的 MVVM 模式的一般问题

Posted

技术标签:

【中文标题】有关使用 WCF 服务的 MVVM 模式的一般问题【英文标题】:General questions regarding MVVM pattern with WCF service 【发布时间】:2014-04-13 14:38:05 【问题描述】:

我正在通过 WCF 服务使用 MVVM 模式构建我的第一个 WPF 应用程序。我是这项技术的新手。经过大量工作并在这个社区的帮助下,我设法为我的应用程序创建了基础,从数据和服务层到使用 MVVM 模式和 WPF 的完整客户端。尽管如此,对这项技术仍有一些概念上的担忧/怀疑,也许有人可以帮助澄清一下。

我的问题

1) 只要我不了解每个 view-viewmodel 都不知道 其余视图的退出。这意味着每个视图都有他的 视图模型是孤立的。所以当我需要在我的应用程序中发生什么 显示视图的实例,它创建一个新视图并需要获取 调用者视图上的这个子视图的结果?在这种情况下,每个视图 has 是 viewmodel,所以我如何在它们之间共享这些信息 视图/视图模型?

2) 我的 WCF 服务将 POCO 的对象暴露给客户端。所以这是 本质上是一个脱节的环境。那么报告呢?如果我 遵循 MVVM 指南,我应该联系我的 WCF 服务 viewmodel,获取对象,然后以某种方式公开我的属性 必须绑定到 XAML 中的报表对象,对吗?所以报告应该 不知道我的数据库。我可以使用哪些对象来构建我的数据库 允许我使用 POCO 的对象作为数据源的报告?

3) 我知道的这个在社区里有点争议。我的数据和 服务层使用从 数据库,没问题。现在我的疑问是,当我与客户沟通时, 我应该使用相同的对象还是构建自己的自定义对象?

4)当我需要将标题细节对象保存到数据库时(例如 来自客户的采购订单),我应该创建一个自定义对象吗 具有标头对象的实例和详细信息项的集合 在服务器端,或者这是视图模型的工作?

5) 谁能给我一个实际的例子,说明什么时候每个视图模型有多个视图是有用的?从我一直在做的事情来看,我得出的结论是,每个视图都非常依赖于视图模型,

任何评论将不胜感激。我正在努力遵循良好的编程 在这里练习。

更新

在复活的 cmets 之后,我将尝试澄清我的问题:

关于 1) 我曾怀疑这是 MVVM 的关键问题之一。无论如何,我试图远离外部工具,因为过去我有过严重的问题。当您确实遇到外部工具包的问题时,要找到答案是非常困难的,有时甚至是不可能的。不能使用 Visual Studio 中的基本 MVVM 用一种不太复杂的方法来解决这个问题吗?

关于 2) 我还没有使用任何东西。我在提前考虑。您如何建议以 MVVM 方式构建我的报告?过去,我使用断开连接的 Crystal 报表对象做过类似的事情。我在服务器中进行了查询(使用记录集),使用 XML 或其他方式将数据发送到客户端,然后在客户端将数据再次转换为记录集并将报表数据源设置为此对象。我正在考虑类似的方法,但使用 pocos 类和 MVVM。有什么想法吗?

关于 3) 我认为这就是我一直在做的事情,但我不确定。例如,当我需要用客户填充组合框以过滤客户订单时,我会直接公开我的 POCO 类。我知道这不是更有效的方法,因为当我只需要 2 o 3 个对象时,我需要传输我的对象的所有属性,但为简单起见,我发送了整个对象。当我需要在网格中显示结果过滤客户订单时,我使用一个自定义类,其中只有我想在网格中显示的属性。当您说“我创建 DTO”时,您是说这个吗? POCO的类不也是DTO吗?

关于 4) 当我需要插入或更新主详细信息对象(而不是客户购买订单)时,通常涉及对至少 2 个或更多数据库对象进行更改。所以我的问题是:我应该在包含单个数据库对象类的数据层中创建和公开一个复杂的对象吗?还是更好地公开基础对象并让viewmodel处理单个对象并将它们一一发送到服务层进行更新?希望清楚。

大约 5) 我怀疑。我会记住的。 谢谢!

【问题讨论】:

【参考方案1】:

    这是 WPF 中 MVVM 的固有问题。有两个库可以帮助解决这个问题。看一眼 Caliburn.Micro 使用 ViewModel 优先方法来解决这个问题 问题。另一个库是微软自己的 Prism 库。这 库采用视图优先的方法来解决这个问题。

    您如何生成报告?如果您使用的是 s-s-rS 之类的东西,他们有自己的公开 WCF 服务来检索报告。 您可以将其包装在一个服务中并在您的 ViewModel 中使用它。

    视情况而定。你的对象有多复杂?如果您正在执行简单的操作,则数据模型可能没问题。然而,对于更多 复杂的操作我倾向于创建一个 DTO(数据传输对象) 包含一个工作单元。

    我不确定我是否理解这个问题。

    您应该努力让每个视图模型始终拥有一个视图。如果有理由有一个单独的观点,可能有一个很好的理由 有一个单独的视图模型。您可能遇到的问题是 与 #1 相关,并且您希望以某种方式在这些视图之间共享数据。

总体而言,我知道您的痛苦,并且出于您所述的某些原因,我对使用 MVVM 的 WPF 有着爱/恨的关系。在我在 #1 中列出的两个框架中,我使用了 Calibrun.micro,它使 WPF MVVM 更易于访问和使用。一个很好的入门博客文章是:

http://www.mindscapehq.com/blog/index.php/2012/01/12/caliburn-micro-part-1-getting-started/

如果你愿意,你也可以看看棱镜:

http://compositewpf.codeplex.com/

还有一些其他的。这是我经历过的两个。棱镜没问题。但是,我个人不喜欢他们的导航服务。

希望这会有所帮助!

【讨论】:

感谢您的精彩回答!我编辑我的问题以添加更多详细信息。如果可以的话,请看一下。

以上是关于有关使用 WCF 服务的 MVVM 模式的一般问题的主要内容,如果未能解决你的问题,请参考以下文章

WPF MVVM WCF 客户端/服务器架构

分层企业应用程序中的 WPF MVVM 架构

在不触发 OnPropertyChanged 的​​情况下更新 WPF DataGrid

身份验证模式=“表单”导致WCF服务中的重定向

WCF , WPF,MVC,有啥不同

WCF , WPF,MVC,有啥不同