2015-05-06 96 views
2

上下文:
C#/ WPF Windows-Store應用程序使用SQLite在本地存儲數據,並通過Web訪問來下載數據。

應用程序:
數據必須從網上下載並映射到存儲在本地SQLite數據庫中的類。例如,在客戶類: MVVM - 正確執行模型

[Table("Customer")] 
class Customer{ 
    [AutoIncrement, PrimaryKey, Unique] 
    public int Id {get;set;} 
    public string Name {get; set;} 
    … 
} 

類得到由不同的線程操作,所以在INotifyPropertyChanged的Customer類是一個壞主意。此外,多個客戶應該通過GUI顯示,因此ViewModel包含一個Customers列表。此外,客戶必須通過多個屬性進行擴展才能正確顯示GUI。

問題:
什麼是模型?客戶?
我應該如何擴展客戶的額外屬性而不會搞亂客戶類?
我應該在哪裏存儲客戶在數據庫中的業務邏輯,或者將數據從網絡下載並映射到客戶類?在模型中?
如果你的答案是客戶是模型​​,它不應該包含任何邏輯,爲什麼MVVM模式說模型包含業務邏輯?

回答

3

客戶肯定是這種情況下的模型。一個模型應該是POCO,並且每個只能由GUI使用的屬性應該在視圖模型中,例如CustomerViewModel。

業務邏輯應該在模型中。存儲在數據庫中可以通過使用repository pattern來解決。

模型通常具有邏輯,但僅限於業務邏輯。根據MVVM,您不應該在模型中使用任何UI邏輯,而應該在視圖模型中使用。

比方說,我們有你的模型

class Customer { 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

,有必要顯示大寫客戶的名稱。而不是增加額外的屬性Customer類,添加一個在視圖模型

class CustomerViewModel implements INotifyPropertyChanged { 
    ... 
    public string UpperCaseName { ... } 
    ... 
} 

我覺得Wikipedia page總結起來相當不錯:

型號

模式是指無論是一個它代表真實狀態內容(面向對象的方法),或者代表內容的數據訪問層(以數據爲中心的方法)。

查看

如在MVC和MVP模式中,視圖是用戶界面(UI)。

查看模型

視圖模型是暴露的公共屬性和指令視圖的抽象。而不是MVC模式的控制器,或者MVP模式的主持人,MVVM有一個活頁夾。在該模型的視圖 模型中,此資料夾介於視圖和數據聯編程序之間的通信。視圖模型已被描述爲模型中的數據狀態 。

粘合劑

聲明數據和命令結合在MVVM模式隱含的。在Microsoft解決方案堆棧中,活頁夾是標記爲 的語言,稱爲XAML。該活頁夾使開發者免於被迫寫入鍋爐板邏輯以同步視圖模型和 視圖。在Microsoft堆棧之外實施時,聲明性數據綁定技術的存在是該模式的關鍵推動因素。

0

什麼是模型?

實體或任何持有/是數據框架的類。

我該如何擴展客戶的額外屬性而不會搞亂客戶類?

通過Partial類修飾符。允許您將專用邏輯放入擴展的操作/屬性中。另外你可以讓客戶堅持改變INotifyProperty

我應該在哪裏存儲客戶在數據庫中的業務邏輯,或者將數據從網絡下載並映射到客戶類?在模型中?

將所有業務邏輯放在ViewModel中以獲取和存儲信息。這是魔術發生的地方,並且是ViewModels之間的通道,用於顯示View

爲什麼MVVM模式會說模型包含業務邏輯?

業務邏輯是構成數據的實體的形式。


剛接觸MVVM的人不知道他們是否正在遵循MVVM。 MVVM(恕我直言)只是一個三層數據系統(記住範式),它將數據從邏輯中分離出來以獲取數據以最終顯示數據;三層。

如果有人將MVVM視爲舊學校三層數據系統其中VM包含/獲取數據(稱爲模型)並處理業務邏輯以處理數據並且僅允許View顯示所述數據;它是如此簡單。