2010-03-15 17 views
7

我正在研究一個WPF應用程序,並且正在使用MVVM模式對其進行構造。最初我有一個想法,即ViewModels應該是可重用的,但現在我不太確定了。ViewModel類應該如何重用?

  • 如果我需要WinForms應用程序的類似功能,我應該能夠重用我的ViewModels嗎?
  • Silverlight不支持WPF所做的所有事情 - 我應該能夠重用Silverlight應用程序嗎?
  • 如果我想爲我的應用程序製作Linux GUI,該怎麼辦?然後我需要ViewModel在Mono中構建 - 這是我應該爭取的嗎?
  • 依此類推。

所以;應該用一個特定的View來編寫ViewModel類還是考慮可重用性?

+0

這是一個老問題,但[MSDN的答案](https://msdn.microsoft.com/en-us/library/hh563947(v = vs.110).aspx)非常清楚(和相反到下面發佈的所有答案):ViewModel非常專門用於跨各種操作系統的許多視圖共享。否則將不可避免地導致冗餘代碼。 – kmote 2016-12-24 20:11:50

回答

12

要回答你的問題,想想單一職責原則:

「A類應該有一個,也是唯一一個 ,理由去改變。」

我想說,在合理範圍內,您通常不希望重複使用ViewModel來處理多個視圖。我爲此爭論的主要原因是因爲這會讓ViewModel有一個以上的理由需要改變。換句話說,如果一個或另一個視圖發生變化,它就需要改變,並且在我看來,這是改變的兩個原因。它停在哪裏?在這種情況下,我會保持簡單,並將一個ViewModel綁定到View。

與MVVM和WPF一起考慮的另一件事是數據模板。如果每個ViewModel迎合一個且僅有一個視圖,則更容易完成。

+0

我完全同意。這是一個很好的論點! – stiank81 2010-03-15 12:39:15

3

就在一般情況下,應用YAGNI principl - 你可能不需要它。除非您可以看到這些事情可能發生,否則我會繼續使用最簡單的方法讓您的軟件滿足您當前的要求。

+0

好點! :-) – stiank81 2010-03-15 12:39:40

2

在我看來,MVVM的主要目標是消除不能通過單元測試輕鬆測試的代碼。由於視圖模型可以進行單元測試,但視圖不能,所以通過使視圖儘可能愚蠢來實現。理想情況下,與XAML一樣,視圖是完全聲明式的,只有數據綁定在視圖模型上。因此,「沒有代碼背後」的口頭禪。

跨不同UI技術的視圖模型的可重用性實際上並不是MVVM的目標。如果您嘗試它,您可能會試圖將特定於UI技術的代碼再次移動到視圖中,以保持視圖模型可重用。這將違背可測性的主要目標。

如果您真的發現自己需要支持不同的UI技術,那麼您仍然可以將視圖模型的通用邏輯分解爲共享的「表示」層。我不會那樣做,直到確定它是必要的。

0

這是一個古老的問題,所以我猶豫添加另一個答案。但迄今爲止發佈的所有答案都沒有涉及到這一點。The answer from MSDN是很明確的,視圖模型非常特別意在通過在各種OS許多視圖共享,這表現在該圖中:

enter image description here

這樣否則將不可避免地導致冗餘代碼。

相關問題