2011-05-26 23 views
2

我正在開發一個使用WPF的應用程序。我使用的模式顯然是MVVM。此外,我正在使用實體框架ORM和LINQ-to-Entities查詢EF對象。涉及在ViewModel或Model中處理數據(來自數據庫)的邏輯?

我對MVVM的理解是,View應該沒有代碼隱藏,只有ViewModel應該具有的知識是ViewModel包含某些與View綁定的屬性,並且它包含處理事件的命令視圖。模型只包含從數據庫獲取數據的代碼。

在我的模型類中,我剛剛編寫了使用Linq-to-entities直接查詢EF對象的函數。在將數據分配給虛擬機中的屬性之前,需要對數據執行的處理過程可能存在於虛擬機或存在於虛擬機項目中的類中。在這裏要提到的是,我有3個項目 - View,ViewModel和Model。

我的問題在於,我可以在VM項目中保留這些函數(涉及處理來自數據庫的數據)還是應該在Model項目中?如果在ViewModel項目中,它應該位於VM項目中的相關VM還是單獨的類中?

回答

2

其中一種常用的做法是將業務邏輯委託給服務層並使用Repository Pattern執行業務邏輯。正如其他答案中所提到的,ViewModel應該使用特定於視圖的屬性和處理UI交互的命令來修飾模型。通過它自己的定義,模型應該擁有操縱數據的所有邏輯。

如果您遵循面向服務的體系結構,那麼ViewModel可以注入一項服務。該服務負責執行業務功能。這些業務功能主要是在持久數據上完成的。並且可以使用任何ORM工具和技術(如EF或NHibernate)很好地抽象該邏輯。你可以做一個谷歌搜索倉庫模式,如果你遵循這個架構可能會有所幫助。

如果您不需要它,則不需要使用存儲庫模式。您仍然可以直接從服務層使用EF。擁有存儲庫的好處是,它可以像持久層(數據庫)和領域層(模型)之間的映射器一樣工作。

希望這會有所幫助。

+0

感謝您的詳細回覆 – 2011-05-27 13:08:19

1

他們應該在模型項目中,ViewModel只是您的View所期望的一種表示形式,僅此而已。

1

責任編輯: 模型 - >從數據庫,服務等獲取數據,並通過域對象公開數據。不關心數據如何顯示。只涉及涉及域對象的業務邏輯。

ViewModel - >從模型中讀取數據並裝飾它們,以便它們可以以正確的格式顯示在View中。公開視圖可以綁定以獲取數據的屬性。還公開視圖可以調用用戶輸入的命令。

查看 - >根據通過DataBinding從VM接收的數據,使用漂亮的DataTemplate或UserControl顯示數據。綁定到VM命令以調用用戶輸入。

理想情況下ViewModel只關心在UI上顯示數據而不是修改模型。它在構造函數中接收模型對象,並通過數據綁定公開要由視圖使用的屬性。模型不知道ViewModel。無論何時模型數據改變,ViewModel都可以通過VM訂閱的模型拋出的事件來通知更改。或者,只要View調用VM中的屬性getter來獲取數據,VM就必須查詢模型。

模型應該公開屬性,而不管它們將如何顯示。所以它不應該對屬性進行任何處理。 ViewModel可以按照視圖的要求修飾從Model接收到的數據。

+0

「每當模型數據發生變化時,ViewModel可以通過VM訂購的模型拋出的事件來通知更改」。你能用一個例子來闡述這一點嗎? 如果ViewModel無法修改數據,Model無法對數據進行任何處理,那麼該邏輯應該放在哪裏? – 2011-05-26 12:41:31

+0

模型應根據業務邏輯更改其內部的數據。每當它改變它的數據時,它就會引發事件通知虛擬機數據改變。如果虛擬機需要更改這些數據以獲得更好的顯示效果,它應該將模型中的數據讀取到它自己的字段中,更改它並通過屬性暴露更改的數據。虛擬機不應該更改模型數據。它只關心數據如何看起來不像業務邏輯。 – 2011-05-26 12:55:19

1

在我看來,最好將數據庫處理函數移動到Model項目中,因爲可能過多的責任將放在ViewModel上。

我會盡量表現爲例:

假設我們有一個類SomeViewModel與性能IsHighlitedItem,這樣的事情:

class SomeViewModel 
{ 
    public bool IsHighlighted 
    { 
     get 
     { 
      /* View logic here */ 
     } 
    } 

    public SomeClass Item 
    { 
     get 
     { 
      /* Retreiveing an item from database */ 
     } 
    } 
} 

現在,當您需要修改視圖邏輯你必須修改SomeViewModel類(沒關係),但是當您需要修改數據庫通信邏輯時,您還需要修改相同的類,但這還不夠好。

Single responsibility principle說:

永遠不應該有一個以上的 原因,一類改變。

因此,如果你保持現在的狀況,將來可能會遇到代碼不必要的大複雜性。

-1

您可能會感興趣的WPF Application Framework (WAF)BookLibrary示例應用程序。它演示瞭如何將實體框架與MVVM模式一起使用。

+1

沒有試圖回答這裏的問題,還有另一個地方讓你鏈接你的WAF。您甚至不會鏈接到網站上的任何特定的有用網頁。 – 2012-08-09 19:29:21