2009-09-23 66 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