2017-09-13 110 views
0

最近,我正在學習MVVM設計模式!按照我的方式,我在模型中編寫數據庫函數,並讓視圖模型調用模型中的數據庫函數,然後viewmodel獲取數據庫數據並將其設置爲viewmodel notfiypropertychanged。這是我目前使用的方式!WPF MVVM模型如何獲取數據

有一些問題讓我對模型感到困惑, 我讀了很多文章告訴我模型只是一個包含數據而不是更多的業務邏輯,這裏是我的問題,如果模型只是一個數據容器,我需要讓我的viewmodel調用數據庫然後獲取數據並設置爲模型,我認爲這種方式非常奇怪,viewmodel代碼變得沉重。有沒有人有另一種方法來做到這一點?謝謝!

+0

是否使用'.NET Core'? – aaronR

+0

我沒有很多的時間,但現在看,如果這[微軟文檔(https://msdn.microsoft.com/en-us/library/gg405484(V = pandp.40)的.aspx)幫助。 – aaronR

+0

我不知道你從哪裏得到*「模型只是包含數據而不是更多的業務邏輯」,但對我來說,業務邏輯是模型的一部分。但是,我觀察到業務邏輯傾向於我的項目的視圖模型,我不能說這是否是一件壞事。 – grek40

回答

1

的型號:

「的模式只是一個包含數據,而不是更多的商業邏輯」

模型是描述你的域邏輯中的一個實體類。什麼是域名?星巴克的領域是咖啡飲料和員工(其中包括),福特的領域是汽車,裝配線和員工。 NYTimes的領域是文章,問題,供應路線,用戶等等。

模型包含數據AND邏輯。您可以有多個模型來描述您的域。

您可以將數據呼叫您的模型,但它更常見的有輔助類,數據訪問層(DAL),讓您的所有數據庫調用在一個地方,而不是四處傳播他們。

視圖模型:

視圖模型坐在你的域模型和視圖之間。這是一個暴露模型屬性並表示視圖狀態的類。例如,視圖模型只能展示UI需要顯示的模型中的所有屬性的子集,但它也可以添加它自己的屬性;用戶處於編輯模式?有更改需要保存嗎?等與MVVM的賣點就是用戶界面結合上這是一種機制來保持UI瞭解最新的變化,和抽象的這種額外的層視圖模型這些特性方便地解耦以任何邏輯模型使它更強大的代碼更改方向和可測試。關於這個話題還有更多要說的,但我會留給你看看。

有很多很好的資源和MVVM模式信息;從博客Model-View-ViewModel (MVVM) Explained,微軟The MVVM Pattern和這裏SO。

如果你喜歡視頻,Pluralsight在MVVM模式 Practical MVVMWPF MVVM In Depths上有很好的視頻教程。他們有一個免費的30天試用期。

「只是一個數據容器」

,使得只有持有其傳遞數據類通常稱爲數據傳輸對象(DTO)。通常將它們保持較小並從獲取數據庫數據方法調用中返回這些集合。

0

我在這方面做了一些研究,也發現它很混亂。我首先想指出的是代碼模式是抽象的。這意味着你有許多不同的方式來實現它/調整它。

大多數人告訴我的是,在「現實生活」的應用程序中,您通常會擁有多層服務。

其中一項服務是您從數據庫獲取數據的位置。

模型工作(在我看來)是爲開發人員提供關於數據庫數據和結構的知識。一個模型到一個數據庫表格。 它還有助於在將數據發送到數據庫之前檢查數據是否正確(格式檢查,數據類型等)。

關於如何使用模型沒有明確的答案。我已經看到了大量不同的實現,並且它們都已經實現了特定的任務。

是的,它可能會出現一些ViewModel變得重載代碼和函數來執行,但它可能不是因爲代碼模式。這可能是因爲代碼結構不良。在我現在的工作中,我發現了一個包含3000多行代碼的ViewModel(這是非常重要的)。這可以很容易地分成至少3種不同的ViewModels和Views,但正如我所說的,糟糕的代碼結構會導致問題。

有一件事我建議您在閱讀起來是

  • IoC的 - 控制反轉的
  • 原則聲明 - 依賴倒置原則
  • DI - 依賴注入

希望這有助於在某種程度上解釋你的問題。

0

我看了很多文章說告訴我,模型只是一個包含數據,而不是更多的業務邏輯

模型可以通過服務,數據庫訪問層或業務層因此沒有任何表示你目前的做法有誤。業務邏輯確實屬於模型。

但有時人們往往指的是「孩子」式的一種模式。例如,如果您的視圖模型公開List<Item>屬性,則Item類可能會被視爲模型。也許你的困惑來自於此。

這種類(Item)通常實現INotifyPropertyChanged接口來提供更改通知,並且實際上只是不包含任何業務邏輯的「嵌套」視圖模型。

希望是有道理的。