我正在编写一个wpf项目并使用MVVM范例,我想知道的是我是否应该在自己的项目中编写我的视图模型类。
我可以看到的优点是你的ui项目永远不必了解你的业务逻辑。 (没有参考)
但是如果我想在我的视图模型中使用ICommand接口,我仍然需要对PresentationCore的引用,这可能表明我应该在我的ui项目中。
评论建议最受赞赏。
答案 0 :(得分:2)
只要在ViewModel中引用PresentationCore(如果您想使用ICommand,目前这是不可避免的),您就会将各种不受欢迎的与View相关的功能泄漏到ViewModel中。例如,MessageBox.Show,当你看到它在一个单元测试中被调用时它驱动它为什么它是坏的。
要回答这个问题,请将View和ViewModel保存在不同的项目中。我自己想知道这一点,但在单独的项目路线之后,我花了一些时间来欣赏它,但它对于让我坚持一个干净的MVVM解决方案非常有价值,而且从中吸取的教训极大地改善了我的整体解决方案架构。这是关于使用接口减少对不必要的程序集的依赖性以及必要时的适配器模式。一个例子是我的View项目,作为入口点有一个对Ninject的引用,但我不希望我的ViewModel有这个引用。否则有人可能会直接使用Ninject静态内核。
关于ICommand,我不知道从4开始只使用WPF的历史,但感觉MVVM是事后的想法。我不确定为什么微软会把这个界面放在PresentationCore中。我希望在将来的版本中为ViewModel层添加一个单独的程序集来解决这个问题。
答案 1 :(得分:1)
我认为以某种方式做到这一点并不是一种极其令人信服的方式。我倾向于将VM及其视图保留在同一个程序集中,但是在不同的文件夹结构中。例如,我可能有 ViewModels / Foo / Bar / CustomerViewModel 和 Views / Foo / Bar / CustomerView.xaml 。
我认为拆分视图和查看模型也没有问题。拥有VM程序集参考视图相关的程序集(如PresentationCore)是很自然的。毕竟,您的视图模型是视图层的一部分。