2009-08-21 23 views
1

使用服務定位器類來爲您的WPF頁面綁定ViewModels時提供ViewModels。 ViewModels應該是Singleton作用域還是Factory作用域? WPF應用程序通常是一個更好的主意?查看範圍在WPF應用中使用服務定位器模式時的模型

我知道在Silverlight中,Singleton更適合用戶控件的頁面,只能移入和移出前景。但直到試圖應用這種模式時,我一直在創建頁面實例和它們各自的虛擬機,每次它們將被加載。

我和我的同事已經經歷了每個選項的所有優缺點,沒有什麼尖叫出哪個是我們場景的更好選擇。

謝謝。

回答

2

我會遠離製作你的視圖模型的單身人士。除非它們是在整個用戶會話中持續存在於區域中的視圖。例如導航或菜單等。如果您使用Prism/Composite WPF,他們將Unity作爲IoC或服務定位器(如果這是您的使用方式),則會在創建視圖模型/演示模型時創建並離開以進行垃圾回收關閉時。這允許每個屏幕按照預期經歷其生命週期。

您可以使用諸如RegionManager(CompositeWPF)之類的東西將視圖模型保存在內存中,直到它們被顯式關閉。如果這是需求,這將允許用戶通過打開的視圖選項卡來維護他們的交互。當用戶決定保存/關閉一個屏幕時,它將從RegionManager中刪除,然後進行垃圾收集。

單身人士是用於特定目的的設計模式,即您只需要一個,並且在應用程序的整個生命週期中只需要一個。如果這不是我的要求,我會遠離。

0

那麼,如果我退一步去思考一個視圖模型在做什麼;我爲它分配一個模型,然後我有我的視圖使用命令或綁定屬性。

因此,立即,每個ViewModel是一個特定於模型的實例。

此外,ViewModel方法通常會與當前模型實例一起工作。這意味着這些方法不是孤立的邏輯單元。即

interface IService 
{ 
    Foo Model; 
    Result DoSomethingWithModel(); 
} 

具有取決於其自身實例狀態的邏輯。

,而這是一個純粹的邏輯服務:

​​

一個好的代碼的做法,在我看來,將是對每個請求注入新的視圖模型的實例,即使你永遠只能有一個請求。

+0

小心解釋下投票?當我接受同樣的結論作爲接受的答案,在這裏:http://stackoverflow.com/questions/6188584/viewmodel-and-singleton-pattern – 2013-02-27 21:40:13