有关WCF服务的MVVM模式的一般问题
本文关键字:问题 模式 MVVM WCF 服务 有关 | 更新日期: 2023-09-27 17:58:03
我正在通过WCF服务使用MVVM模式构建我的第一个WPF应用程序。我是这项技术的新手。经过大量工作,在这个社区的帮助下,我设法为我的应用程序创建了基础,从数据层和服务层到使用MVVM模式和WPF的完整客户端。尽管如此,对这项技术还是有一些概念上的担忧/疑虑,也许有人可以帮助澄清。
我的问题
1) 只要我不了解每个视图,视图模型就不知道其他视图的存在性。这意味着视图模型是孤立的。那么,当我需要在我的应用程序中实例来显示一个视图,该视图创建了一个新视图,并且需要获取调用方视图上的此子视图的结果?在这种情况下,每个视图有viewmodel,那么我如何在视图/视图模型?
2) 我的WCF服务将POCO的对象公开给客户端。所以这是本质上是一个令人不满的环境。那么报告呢?如果我遵循MVVM指南,我应该通过viewmodel,获取对象,然后以某种方式公开一个属性必须绑定到XAML中的报表对象,对吗?所以报告应该不知道我的数据库。我可以使用哪些对象来构建允许我使用POCO对象作为数据来源的报告?
3) 我知道这个在社区里有点争议。我的数据和服务层使用从数据库,维奇还好。现在我怀疑,当我与客户通信时,我应该使用相同的对象还是构建自己的自定义对象?
4) 当我需要将标头详细信息对象保存到数据库时(例如来自客户的采购订单),我是否应该创建一个自定义对象具有标头对象的实例和详细信息项的集合在服务器端,或者这是视图模型工作?
5) 有人能给我一个实际的例子,说明什么时候每个视图模型有一个以上的视图是有用的吗?根据我所做的,我得出的结论是,每个视图都非常依赖于视图模型,
如有任何意见,我们将不胜感激。我正在努力遵循好的程序在这里练习。
更新
在恢复评论后,我将尝试澄清我的问题:
大约1)我怀疑这是MVVM的关键问题之一。不管怎样,我尽量远离外部工具,因为在过去我有严重的问题。当您确实遇到外部工具包的问题时,很难找到答案,有时甚至不可能。难道不能用Visual Studio中提供的基本MVVM用一种不那么复杂的方法来解决这个问题吗?
大约2)我什么都没用。我在提前考虑。您建议如何以MVVM的方式构建我的报告?过去,我曾使用断开连接的Crystal报表对象做过类似的事情。我在服务器中(使用记录集)进行查询,使用XML或其他方法将数据发送到客户端,然后在客户端中再次将数据转换到记录集,并将报表数据源设置为此对象。我正在考虑类似的方法,但使用pocos类和MVVM。有什么想法吗?
我想这就是我一直在做的事情,但我不确定。例如,当我需要用客户填充组合框来过滤客户订单时,我会直接公开我的POCO类。我知道这不是更有效的方法,因为当我只需要2到3个对象时,我需要传输对象的所有属性,但为了简单起见,我发送了整个对象。当我需要在网格中显示结果过滤客户订单时,我使用一个自定义类,该类只包含我想在网格中展示的属性。你说"我创建DTO"是指这个吗?POCO的课程不是也是DTO吗?
大约4)当我需要插入或更新主细节对象(而不是客户的订单)时,通常需要对至少2个或多个数据库对象进行更改。所以我的问题是:我应该在数据层中创建并公开一个包含单个数据库对象类的复杂对象吗?还是最好公开基本对象,让viewmodel处理单个对象,并将它们逐个发送到服务层进行更新?希望一切都清楚。
我怀疑。我会记在心里的。谢谢
这是WPF中MVVM的固有问题。有两个库可以帮助解决这个问题。看看Caliburn。Micro使用ViewModel优先的方法来解决此问题问题另一个库是微软自己的Prism库。这库采用视图优先的方法来解决这个问题。
您是如何生成报告的?如果您使用的是类似SSRS的东西,它们有自己公开的WCF服务用于检索报告。您可以将其封装在服务中,并在ViewModels中使用它。
这取决于情况。你的物品有多复杂?如果您正在进行简单的操作,那么数据模型可能很好。然而,更多复杂的操作我倾向于创建一个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/
还有其他一些。这是我曾经接触过的两个人。棱镜还可以。但是,我个人不喜欢他们的导航服务。
希望这能有所帮助!