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

时间:2014-04-13 14:38:06

标签: c# wpf wcf mvvm

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

我的问题

  

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

     

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

     

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

     

4)当我需要将header-detail对象保存到数据库时(例如   我应该创建一个自定义对象   具有头对象的实例和详细项的集合   在服务器端,或者这是viewmodel工作?

     

5)有人可以给我一个实际的例子,说明每个viewmodel有多个视图有用吗?从我一直在做的我得出结论,每个视图都非常依赖于viewmodel,

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

更新

在复活的评论之后,我会试着澄清我的问题:

  

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

     

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

     

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

     

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

     

关于5)我怀疑。我会记住它。   谢谢!

1 个答案:

答案 0 :(得分:4)

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

  2.   
  3. 您是如何生成报告的?如果您使用的是SSRS之类的东西,他们会有自己的外部WCF服务来检索报告。   您可以将其包装在服务中并在ViewModel中使用它。

  4.   
  5. 这取决于。你的物品有多复杂?如果您正在进行简单的操作,那么数据模型可能就好了。但是,更多   复杂的操作我倾向于创建一个DTO(数据传输对象)   包含一个工作单元。

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

  8.   
  9. 您应该努力为每个视图模型提供一个视图。如果有理由有一个单独的视图,可能有一个很好的理由   有一个单独的viewmodel。你可能遇到的问题是   与#1相关,您希望以某种方式在这些视图之间共享数据。

  10.   

总的来说,我知道你的痛苦,并且由于你所声明的一些原因,我使用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/

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

希望这有帮助!