2010-06-25 63 views
1

在維護模型 - 視圖模型關係(例如,爲模型的每個實例創建vm實例)之後爭鬥了一段時間,我有一些可能頗有爭議的想法,但我好奇的意見。MVVM和從模型到視圖模型的隱式轉換

如果使用VM類來維護模型實例的靜態容器列表會怎麼樣? 那些可能(甚至應該)是弱引用,所以無論何時模型類實例超出範圍,它的視圖模型都會自動處理。另一個選擇是重用虛擬機實例。

另一種適用於第一種方法的想法可能是創建一個從模型到視圖模型類的隱式轉換運算符。每當從模型實例投射時,我總是會獲得同樣的vm實例。

您對此有何看法?這是否違反規則和MVVM模式?

//編輯 我應該也可以提供這背後的動機:在我的應用程序中,我有多個地方使用我的模型類之一,並需要相應的vm引用。在每個這樣的地方,我需要觀察一個集合並對變化做出反應 - 創建或刪除虛擬機實例。這與在許多地方重複的代碼基本相同=>我認爲只創建一個地方來做到這一點(隱式轉換隻是一個糖果,它不需要解決實際問題)。或者,也許而不是靜態列表我應該創建一個管理器來處理所有類的視圖模型實例創建?

+0

現在幾年後,你有沒有發現一些缺點?看到基本上重複的代碼會很有趣,但我不認爲這是正確的? – WiiMaxx 2015-07-22 13:53:26

回答

0

首先,我不確定您的想法是否違反了MVVM模式。在我看來,每種情況下填充模式都不是那麼重要。我眼中的一種模式提出瞭解決問題的策略。在大多數情況下,通過一切手段100%是不值得的。如果有一個實用的解決方案,你應該使用這個。當然,這應該是引導你達到目標的解決方案,例如單元測試,UI分離和應用邏輯等。

無論如何,當我第一次讀你的文章時,我認爲實現一個演員操作符是個好主意。但如果我沒有錯,則需要在模型中引用視圖模型。我總是儘量避免這一點,以最大限度地利用重複使用機會。但我認爲有這樣的參考並不違反這種模式。也許別人可以更多地瞭解這一點。

對我而言,您的經理主意是最好的方法。我使用類似的方式來創建視圖模型。這取決於您需要創建多少個視圖模型,但您應該創建新視圖模型而不是重新使用現有視圖模型。在某處我讀到視圖模型應該是某種狀態機的視圖。遵循這個想法,當你重複使用視圖模型時,你永遠不知道視圖模型是在什麼狀態。所以首選的方法是創建一個新的視圖模型。

只是有些想法!也許有一些其他的想法...

+0

謝謝您的回答:)簡單評論一下:我想聽取關於這種方法可能存在的缺點的意見,因此我的問題可能有點偏離軌道。這裏的另一件事是我沒有任何模型耦合來查看模型。隱式轉換操作符可能在這兩種屬於轉換類型的類型上定義,所以在這種情況下,我將在vm類中定義它。 關於vm是一個用於視圖的狀態機,你是完全正確的,所以可重用的vm實例可能不是一個好的解決方案。 – kubal5003 2010-06-25 10:15:25

+0

我真正需要的是每個使用它的上下文的一個vm實例,因此這變得非常棘手。另一種方法可能是爲不同的上下文定義不同的屬性/事件,但是如果我需要兩個非常類似的用法,那可能會導致相當大的混亂。我將不得不考慮更多.. ViewModel管理器現在似乎是一個更好的選擇,因爲它提供了更多的靈活性和能力來使用更多的信息(如上下文) – kubal5003 2010-06-25 10:20:11