2009-09-23 68 views
2

我正在编写一个wpf项目并使用MVVM范例,我在想如果我应该在自己的项目中编写我的视图模型类。ViewModel和用户界面项目位置

我可以看到的优点是你的UI项目永远不需要知道你的业务逻辑。 (没有参考它)

但是,如果我想在我的视图模型中使用ICommand接口,我仍然需要对PresentationCore的引用,这可能表明我应该在我的UI项目中。

意见建议最受赞赏。

回答

1

我不认为有一种非常有说服力的方式来做到这一点或其他。我倾向于将VM和它们的视图保留在同一个程序集中,但在不同的文件夹结构中。例如,我可能有ViewModels/Foo/Bar/CustomerViewModelViews/Foo/Bar/CustomerView.xaml

我不认为有拆分视图和视图模型的问题。让VM组件参考视图相关的组件(如PresentationCore)是很自然的。毕竟,你的视图模型是你的视图层的一部分。

2

只要您在ViewModel中引用PresentationCore(如果您想使用ICommand,这当前是不可避免的),您正在将所有不需要的视图相关功能泄漏到ViewModel中。例如,MessageBox.Show,当你看到这个在单元测试中被调用时,它驱动它为什么不好。

要回答这个问题,请将View和ViewModel保存在单独的项目中。我自己想到了这一点,但是在完成单独的项目路线之后,我花了一段时间去欣赏它,但是它使我坚持一个干净的MVVM解决方案非常有价值,并且从中获得的教训极大地改进了我的整体解决方案架构。这完全是为了减少对使用接口的不必要程序集的依赖性,如果有必要的话,还要减少Adapter模式。一个例子是我的View项目,作为一个入口点有一个Ninject的参考,但我不希望我的ViewModel有这个参考。否则有人可能会直接使用Ninject静态内核。

关于ICommand,我不知道从4开始只使用WPF的历史,但感觉就像是MVVM是事后才想到的。我不知道为什么微软会把这个接口放在PresentationCore中。我希望这将在未来的版本中针对ViewModel层单独装配来解决。

+0

虽然这只是归结为纪律。什么是防止不受约束的开发人员从VM组件中添加对PresentationFramework的引用?无论您是否将虚拟机分成另一个程序集,都需要遵守纪律。 – 2012-11-14 09:41:40