2011-03-04 62 views
2

因此,我正在研究使用C#與WPF(使用Expression Blend)的MVVM,並遇到了如何正確實現從數據庫中收集數據並將其顯示在窗口中的問題。C#MVVM - 這裏需要一個模型嗎?

我的觀點只是一個有幾個TextBlocks的網格,我可以用SQL查詢中的數據更新(我報告的是由我們公司和我們的電話代理進行的呼叫次數,所以所有呼叫,來電呼叫等)

我的問題是,我需要一個模型在這裏獲取/保存數據還是不錯的(或接受)MVVM的做法,在視圖模型來做到這一點?如果我在VM中執行它,我可以輕鬆實現INotifyPropertyChanged事件,並且一切正常。如果我創建一個模型來保存數據,那麼我必須在模型和虛擬機中創建一個INotifyPropertyChanged,或者還有其他應該用來執行通知的事情嗎?

這似乎是一個直接的任務,但我似乎無法找到一個很好的例子顯示數據片斷,我發現每個例子都是一個集合,併成爲我的第一個MVVM程序,我想確保我這樣做的權利:)

我在另一篇文章中有人說:「每一個模型都需要一個虛擬機,但不是每一個虛擬機需要一個模型」閱讀。這與我上面的問題一致,只是想聽聽一些有經驗的用戶的想法。

感謝, 布賴恩

回答

0

*您應該」有一個模型,您應該覺得作爲兩個獨立的部分組成:
1)域某種物體,它封裝業務規則和邏輯(即客戶)
2)一些數據對象的訪問排序,它封裝

這兩個應注入您的視圖模型的構造函數,而不是某個地方newing起來視圖模型的內部數據檢索(即CustomerDao或CustomerRepository):

class CustomerViewModel(Customer customer, CustomerDao){...} 

應該即使看起來微不足道也要測試;如果它只需要一兩個測試來證明它有效,那就太棒了。

HTH,
Berryl

+0

我同意我應該測試並瞭解紅綠重新因素,但我不確定我應該在這裏測試什麼。如果我所做的只是從數據庫獲取數據(這不是單元測試,而是集成測試),然後顯示數據,我應該在這裏做什麼樣的測試? – BrianKE 2011-03-04 14:44:31

+0

不知道你的用例,我可以考慮以下視圖模型測試:它是如何消費數據的。是的,這是一個單元測試,所以嘲笑或僞造數據。首先,有一個確保空數據訪問對象(dao)拋出錯誤的測試。其次,測試你的dao的適當方法被調用,也許它是dao.FindAll()。現在可能已經足夠了,但是當您考慮如何消費數據時,您會想到其他人。如果您需要更多幫助,請提問併發布一些代碼。 Cheers – Berryl 2011-03-04 16:12:47

+0

@BrianKE - 集成測試很好,但是將集成測試和單元測試相結合對於數據庫來說至關重要。部分模型允許您實現用於將db與模型分離的抽象類型,以便您可以進行單元測試。就像我在我的主要答案中所述,如果你不打算測試,那麼不要擔心。當然,你應該進行單元測試和集成測試,但是如果你在項目開始時沒有承諾這項工作,那麼最好是交付,並考慮下一次迭代,發佈或項目的測試工作。運輸是一項功能。 – 2011-03-06 01:53:29

0

MVVM不是一個嚴格的模式。你可以做你覺得適合你的情況。

有一些人誰都會說,該模式不應該執行INotifyPropertyChanged,但我似乎這背後沒有合乎邏輯的理由。

象你所說的去與一個單一的虛擬機,沒有模型,並直接在VM填充性,我建議,對於一個簡單的例子。

你應該去,你有一個或幾個車型,有超過其多個視圖的完整視圖查看模型-Model模式,那麼你就需要多次的ViewModels,按次之一。

我已經實現了MVVM,其中VM有一個Web服務引用並從Web服務中抽取了它的模型,您可以說來自Sql查詢的DataSet是模型並將ViewModel包裝在DataSet中的數據周圍。

+0

我不是下面這種說法,你能在它擴大? 「你應該去一個完整的View-ViewModel-Model模式,在這個模式中你有一個或幾個模型,並有多個模型,那麼你需要多個ViewModel,每個模型一個ViewModel。」 – 2011-03-04 05:48:09

+0

基本上我是說一個簡單的場景可能不需要單個模型,但是如果您有多個視圖共享數據,那麼一個共同的模型肯定是必需的。 – benPearce 2011-03-04 05:59:28

+0

明白了。謝謝。 (同意) – 2011-03-04 06:14:15

0

我認爲你需要某種模型,即使它只是一個簡單的類,這樣你就可以抽出數據庫(可能用一個接口)並測試從虛擬機到與dB交互的方法。實現MVVM結構還有其他好處。它提供了關注點分離,更清晰的邏輯和可能的代碼重用。

我對你的問題的回答是:「你要考?」如果不是,那麼你不需要一個模型。將代碼放入虛擬機並交付項目。如果你要測試,引入一個模型。