2014-06-10 55 views
3

我有一個處理髮貨數據的WPF mvvm應用程序,這包括將其分解爲項目和形式代碼等。全球數據真的那麼糟糕?

但是,我現在面臨的問題是需要了解衆多的viewmodels,哪些項目目前已被選中,該形式等等,以及可以訪問從數據庫中提取的諸如項目之類的數據列表。

現在這個數據被加載,更新,刪除和插入通過我稱爲存儲庫的類。比如ProjectRepository,我的計劃是將加載的數據存儲在這些類中,因此它將包含一個List(其中項目是我的模型),它將公開訪問,而這些存儲庫是靜態的。

所以問題歸結到這一點,Proformas基於當前選定的項目(通過來自數據庫的projectID)加載,因此存儲庫需要知道選擇了哪個項目。我目前的系統使用了自定義事件,這些自定義事件也是爲了捕獲項目選擇中的變化而訂閱的,但是對於我來說,現在我有幾十個事件,每個事件都有幾十個訂戶,並且坦率地說,這使得它很難按照代碼。

所以,對於大量的文本抱歉,我想說清楚我的情況是什麼,並提出我所知道的問題似乎會使一些人感到憤怒。有一個靜態類只是爲所有當前選定的對象(項目,形式表示,裝運等)保留屬性有什麼問題,這將使我的生活變得更容易。

或者有沒有一種「正確」的方式做到這一點,我還沒有看到?

+2

投票似乎有點超過頂部? – BenjaminPaul

+0

我一直問。正如「嗨,VMA,這是VMB。您對財產XYZ的當前價值是多少?」 「富」。 「好的,當你Foo I Bar(),Kthxbai!」當然,VMA需要參考VMB,但是由於它們根據其邏輯需求彼此交互,這有什麼壞處? – Will

+0

這實際上是我從未想過要做的事情。我想這種方法似乎沒有錯,除了一些虛擬機需要引用多個其他虛擬機,並且可能會變得混亂。 – Ben

回答

0

在桌面解決方案中,每個進程都是單用戶使用,使用共享數據的靜態類完全沒有問題(對於很多情況,這是「正確」的方式),問題當一個進程用於爲多個用戶(例如網頁)提供服務時就會出現這種情況,因爲數據將在用戶之間混合使用。

+0

啊,對不起,我應該提到,這只是一個桌面應用程序。 – Ben

+0

是的,我認爲它,我只是把這句話來澄清什麼時候使用靜態數據是一個壞主意 – Gusman

0

全局狀態的問題在於,它很難爲應用程序編寫單元測試。

解決問題的一種方法是測試更友好,那就是擁有一個工廠類,負責構造和返回給定視圖模型的相應存儲庫。

1

我認爲,如果您試圖將全局靜態對象用於可變數據,它通常會指向一個設計缺陷。

使用全局變量的中心問題是你失去了所有的封裝。這意味着,隨着應用程序規模的擴大,您無法將程序的某些部分作爲組件進行考慮(或測試)。每個組件的每個實例都可能與其他每個組件進行交互,由全局靜態對象調解。一旦你添加了線程和併發的組合,問題就複雜了。

我現在的系統使用的ViewModels爲了捕捉在項目選擇改變訂閱自定義事件,但它似乎有點可笑,我認爲我現在有幾十項活動,每次幾十用戶,並坦率地說,它使得很難遵守代碼。

我不相信這會讓你的生活更輕鬆,即使在短期內。項目變更時,視圖模型是否需要得到通知?否則,他們可能會顯示或採取陳舊的數據。這聽起來對我來說(無可否認,基於有限的信息),您應該嘗試並簡化用戶更改項目時發生的事件鏈。

也許你可以丟掉視圖並重新創建它們?或者,也許像「OnProjectChanged」一樣將虛擬方法添加到基本視圖模型中?或者,也許,如果視圖模型實際上不需要得到有關更改的通知,只需將它們傳遞給Func<ProjectData>,以便他們可以在需要時懶惰地拉取當前數據。我不知道最好是什麼,但必須有一個更好的解決方案,而不是引入全球統計數據並承擔所有需要面對的難題。