我该向我的ViewModel构造函数传递哪些参数?

5

我对WPF/MVVM相当新手,正在尝试理解这种模式。我正在探索这个MVVM应用程序:http://msdn.microsoft.com/en-us/magazine/dd419663.aspx

作者创建了一个Customer类,存储在Model文件夹中,还创建了一个CustomerRepository类,存储在DataAccess文件夹中。

CustomerRepository包含一些“做事情”的方法,例如static List<Customer> LoadCustomers(string customerDataFile)。也就是说,我们不能说CustomerRepository是纯粹的模型文件,它也是一种实用程序文件。

另一方面,CustomerRepository存储重要数据readonly List<Customer> _customers;,我们知道应该将这种数据存储在模型中!

我想说的是,CustomerRepository混合了东西——它是一个包含一些实用方法的模型文件。

问题在于,CustomerRepository实例被传递给ViewModelpublic AllCustomersViewModel(CustomerRepository customerRepository)。现在viewModel包含了一些不应该包含的东西,特别是它可以强制CustomerRepository重新加载等。

在我看来,这违反了MVVM模式,我认为ViewModel只应包含对模型文件的引用,所有实用程序类和方法以操作模型文件的方式应该在其他地方

我是对还是错?将提供一些模型服务的类(可以重新加载/刷新模型等)传递给ViewModel是否可以?也就是说,所谓的服务层应该放在哪里,将其放在ViewModel中是否可以?


如果传递一个接口而不是存储库类,视图模型将无法重新加载内容,并且只会调用在接口中公开的方法。 - vortexwolf
@vorrtex,总是可以通过反射来完成某些事情(如果在C#中存在的话...)。 - Oleg Vazhnev
我在学习MVVM时发现这个视频非常有帮助,你应该去看一下 - http://www.youtube.com/watch?v=tKfpvs7ZIyo - Eamonn McEvoy
3个回答

4

您在“ViewModel只应包含对模型文件的引用”这一假设上是错误的。

ViewModel可以引用其需要的任何内容,只要不是视图。

将服务注入到ViewModel中非常常见。


1

好问题。我相信在大多数MVVM应用程序中,你会发现相同的情况。实际上,ViewModel知道如何与服务、仓储进行通信,直接或间接取决于应用程序设计,所以这是非常好的。此外,ViewModel应该能够强制重新加载数据,以反映UI请求的更改。通过命令和绑定将ViewModel与View解耦,通过公开命令,ViewModel能够处理任何特定的命令,然后从服务中请求/更新新的数据,无论是什么。


那么问题是 - "服务层" 应该放在哪里?我认为 "模型" 应该是 "干净的",所以我应该从中提取服务... - Oleg Vazhnev
ViewModel 不是模型,ViewModel 知道模型,封装了一些与模型相关的逻辑并能够与模型一起工作(更改它)。服务可以是一个独立的层,但 ViewModel 只保留对它需要使用的服务的引用(通过构造函数注入服务)。 - sll

1

据我所知,MVVM模式有两种广泛的处理方式。

第一种,你似乎更熟悉,包括四个组件:视图、模型、视图模型和控制器。在这里,视图模型仅包含UI逻辑,并向控制器公开事件,用于视图模型和模型之间的同步。

第二种,在本文中使用的是将视图模型和控制器合并为一个视图模型的方式。顺便说一下,马丁·福勒(Martin Fowler)描述了这种情况:http://martinfowler.com/eaaDev/PresentationModel.html

选择取决于个人喜好,我认为。


奇怪,从未听说过MVVMC模式。 - user1228
@Will 那么你应该搜索一下:1, 2 - Pavel Gatilov
@Will 对不起,这是你所要求的吗? - Pavel Gatilov
没有提问,只是在陈述。不知道。我可以理解遵循SRP和保持VM轻量化的尝试(它们肯定会变成臃肿的混乱!),但我不确定此时添加C是否合适。我需要阅读更多相关信息(这里的一个问题和一个简短的博客文章并不能解决问题)。 - user1228

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接