2013-01-12 20 views
2

有一個Web服務。有關服務參考和MVVM模式的一些常規問題

  • 它提供了類型ZooAnimal
  • Zoo有一個動物id和名字的字典。
  • Animal有屬性:Id,Name(additional stuff)
  • 它有一個方法GetZoo返回一個動物園對象。
  • 它有一個方法GetAnimalStuffById返回Animal對象與Id,Name(additional stuff)

所以這個想法是 - GetZoo允許我獲取動物ID +名稱列表,然後GetAnimalStuffById獲取完整的動物信息。

我在VS中爲該服務添加了一個「服務引用」,並且希望編寫一個MVVM應用程序。有些事情我不完全明白,需要被洗腦。

  1. 自動生成的類可以作爲我的模型嗎?

  2. 與示例無關,但無論如何:添加服務引用時應指定什麼「集合類型」? ObservableCollection是一種矯枉過正的行爲嗎?

  3. 說,用戶轉到顯示完整動物信息的應用程序頁面。顯然,最初我有一個AnimalViewModel只有IdName值(取自GetZoo)。當頁面被導航到時,我打電話給GetAnimalStuffById並獲得一個包含所有數據的Animal對象。接下來我應該做什麼?將我的視圖的DataContext替換爲從新的Animal對象(A)創建的新的AnimalViewModel,或者只是替換它中的值(B)?

  4. 如果答案是(A),如何在所有視圖中替換DataContext?

  5. 如果答案是(B),會導致更新的是什麼?虛擬機是否應該訂閱一些奇特的經理關於獲取Animal更新的事​​件?還是有其他方法?

  6. INotifyPropertyChanged在自動生成類中的用途是什麼?在我的情況下,它們總是從web服務中返回。微軟是否建議在某些情況下將它們用作ViewModel?

謝謝。

回答

1

這裏有幾個答案,根據我自己的經驗MVVM(這可能是也可能不是「最佳實踐」。)

  1. 絕對!不需要做任何事情 - 參見#5和#6(儘管有人不同意這裏)。

  2. 是的,除非你真的需要服務器端的ObservableCollection的功能,否則我會說這是過度的,可能會讓其他人感到困惑。從技術上來說,通過線路發送的消息沒有任何開銷,但我會更簡單一些,比如數組。

  3. 圍棋與選項B.

  4. -

  5. 例如,你可以在你的AnimalViewModel一個屬性來保存所有額外的東西:public Animal AdditionalData { ...。現在,任何撥打GetAnimalStuffById的人都可以使用該Animal對象更新當前ViewModel的附加數據。

  6. 我假設你已經知道INotifyPropertyChanged有讓觀知道一些數據已經改變的地方(如果沒有,谷歌搜索「INotifyPropertyChanged的MVVM」應該讓你開始)。現在,連接#1和#5的點,您的視圖現在可以通過通過AdditionalData屬性綁定到動物的附加數據,而無需重新創建ViewModel中的所有內容:<TextBox Text="{Binding Path=AdditionalData.HeightOrWhatever}" />

注:如果您的視圖是不是WPF或Silverlight,最後一點將沒有多大意義..

+0

恩,非常感謝! –

1

,這裏是根據我的經驗答案(主要提供的另一點查看)

  1. 從端點自動生成Models沒問題。但我會推薦POCO Models而不用任何INPC cruft。有兩個原因,a)它使Models更簡單和更容易維護,以及b)您不會試圖將Models直接暴露給View,或者如果你這樣做,他們將無法正常工作。

  2. 繼續從#1開始,我不會在Models中使用ObservableCollection。再次保持簡單並避免將Models直接提交給View

  3. 選項(B)

  4. -

  5. 所有在ViewModel屬性應實現INPC。然後當你改變它們時,綁定會自動更新。您可以將所有AdditionalData值作爲您的AnimalViewModel的屬性來展平數據,或者您可以讓AdditionalDataViewModel對象保存額外的數據。要將數據從AdditionalData對象映射到AdditionalDataViewModel,請考慮使用映射工具,如AutoMapperValueInjecter

  6. 我不知道爲什麼自動發電機將INPC東西添加到您的模型中。你使用什麼工具?無論如何,正如我所說的,我不建議在Models中使用INPC,或者將Models暴露給View。相反,您應該將Models映射到ViewModels,並且只將ViewModels暴露給View

+0

+1對於映射器。只是出於興趣:爲什麼你認爲這是一個暴露你的模型是否是否定的? – Sphinxxx

+0

@Sphinxxx在您直接公開模型時所處理的項目中,當您添加僅查看屬性(例如計數,或可見性標誌或SelectedItem屬性)時,它們會變得混亂。現在你的模型被視圖概念污染了。每當我有模型與他們的變化邏輯他們變得複雜(當x屬性在這裏改變,更新y屬性在該對象上)。最後,將POCO模型和映射值添加到ViewModel會更簡單。 –

+0

@Sphinxxx此外,我維護一個非常大的MVVM應用程序(100多個屏幕),所以我有很多模型和ViewModels。我懷疑對於較小的應用程序而言,複雜性不是一個問題。 –