2012-12-13 53 views
6

我有一個WPF應用程序,它看起來是這樣的:WPF,MVVM,ICommand的,和庫

enter image description here

視圖模型包裝模型,並公開有關通過INotifyChanged視圖的任何屬性。該視圖也綁定到幾個ICommand對象,該對象處理視圖觸發的某些行爲。我有一個外部ICommand,其唯一目的是將模型保存到數據庫。

我讀過的一切都表明視圖或視圖模型都不應該有對存儲庫的引用。這是視圖模型之外的命令3的原因。

我的問題是雙重的。首先,這是一個合理的體系結構,其次,將模型實例轉移到命令3以便將其放入存儲庫的好方法是什麼?

+0

虛擬機中的命令1和命令2是多少,虛擬機的命令3是多少?是不是所有的命令都在他們自己的類中單獨實現,只是作爲屬性添加到虛擬機中?在這種情況下,一個命令如何在虛擬機和虛擬機的另一個輸出? –

回答

8

我個人認爲讓ViewModel引用存儲庫沒有問題。試圖避免這將導致不必要的併發症。

在MVVM中,ViewModel通常是位於模型上方的「粘合」層,而存儲庫是模型的一部分(它是特定於域的數據/邏輯的一部分)。我如何我個人認爲這個blog series on MVVM shows a good image

MVVM Diagram

直接把命令3到VM可能比試圖將它分離出來,清潔劑,讓與存儲庫中的虛擬機的工作。

+0

我只是想補充一下里德所說的話:如果你願意,你可以通過抽象出你的存儲庫的細節來解開它。但我同意,沒有理由將圖表顯示的方式完全分開。 – Tim

+0

@Tim好點。抽象出庫的詳細信息是非常有用的,但幾乎是一個單獨的問題(偉大的可測試性等)。 –

+0

我同意這是一個單獨的問題,但我有些懷疑,這種抽象可能是OP聽到他應該解耦的原因。只是想回答「那麼爲什麼[誰]說我應該這樣做,如果我不需要?」他問之前的問題! – Tim

0

視圖模型應該與業務層(域對象+域服務)通信,而不是直接與存儲庫通信。更進一步說,這個通信應該通過命令完成。

所以,你必須:

查看 - >視圖模式 - >命令 - >域對象/域名服務 - >庫

除非你正在開發一個非常簡單的CRUD應用程序...