2013-06-04 32 views
6

我發現,在很多情況下,它似乎是(至少表面上)是有道理的使用單身或靜態類在我的WPF的MVVM應用模型。大多數情況下,這是因爲我的大多數模型都需要在整個應用程序中進行訪問。製作我的模型static是滿足這一要求的一種簡單方法。有沒有比使用MVVM的靜態類或單例更好的方法?

然而,我之間存在衝突,因爲這個星球上的每個人似乎都討厭單身人士。所以我想知道我沒有更好的方法,或者如果我做了明顯錯誤的事情?

+3

製作「模型」靜態?不,不是。一點兒都沒有。這甚至比[用RegEx解析HTML]還糟糕(http://stackoverflow.com/a/1732454/643085) –

+0

Heh。我無法抗拒,我看到了。 – sircodesalot

+0

如果使用DI,而不是將其設置爲靜態,則使用ContainerControlledLifetimeManager將其註冊到容器中。有了靜態,你有更多的是線程安全的問題。 –

回答

5

有一對夫婦與單身的問題。我會在下面概述它們,然後提出一些替代解決方案。我不是一個「永遠不要使用單身人士,或者你是一個垃圾編碼器」的人,因爲我相信他們確實有他們的用途。但這些用途很少見。

  1. 線程安全。如果你有一個全局靜態的Singleton,那麼它必須是線程安全的,因爲任何時候都可以訪問它。這是額外的開銷。

  2. 單體測試對單身人士來說更加困難。這是一個廉價的替代全局變量(我的意思是,這是一個單身人士在一天結束時,雖然它可能有方法和其他奇特的東西)。

看到,這並不是說辛格爾頓的是「可怕可憎」每本身,而是它的第一個設計模式,許多新的程序員去處理和便利混淆了陷阱(只要堅持一些齒輪它並稱之爲蒸汽朋克)。

就你而言,你指的是模型,這些都是「實例」,因爲它們自然反映了數據。也許你擔心獲得這些實例的成本。相信我,它們應該可以忽略不計(顯然是數據訪問設計)。

所以,替代品?將模型傳遞給需要它的地方。這使得單元測試更容易,並且允許您在心跳中更換該模型的基礎。這也意味着你可能想看看接口 - 這些表示合同。然後,您可以創建實現這些接口的具體對象,而且您的代碼很容易進行單元測試,並且可以修改。

在單身人士的世界裏,對單身人士的單一改變可以從根本上打破代碼庫中的一切。不是一件好事。

+0

尼斯。我甚至會說:除非你沒有其他選擇,否則不要使用單身。 –

2

我覺得接受的解決這個問題是使用依賴注入。當你想要它依賴注入,你可以定義你的模型作爲常規,非靜態類,然後有控制容器的反轉「注入」模型的實例。

有一個在wpftutorial.net一個很好的教程,顯示如何做到依賴注入在WPF:http://wpftutorial.net/ReferenceArchitecture.html

+0

有趣。幾個星期前我開始學習DI。看起來像我將採摘回來了。謝謝。 – sircodesalot

2

我使用的唯一靜態類是MessageBroker,因爲我需要通過應用程序實現相同的實例。

但即使如此,使用Unity(或其他依賴注入/容器)來管理您只需要其中一個類的實例也是非常可能的。

這使您可以在需要時注入不同的版本(例如,期間的單元測試)

順便說一句:靜態是不一樣的單例。但我沒有深入這裏。只是搜索stackoverflow更有趣的問題:)

相關問題