2012-01-15 61 views
2

假設我們希望在用戶登錄到應用程序之後保留用戶信息以在多個類上共享其數據,那麼最好的方法是什麼。將用戶信息存儲在靜態類中

通常我保持這樣的事情與屬性的靜態類:

public User CurrentUser { get; set; } 

什麼是你的主意嗎?

在此先感謝。

+3

什麼樣的應用程序?的WinForms? ASP.NET? WPF? – 2012-01-15 05:50:51

+0

對不起,我沒有具體說明,我編輯了這篇文章。 – saber 2012-01-15 05:51:51

+0

@ChrisShain我編輯了標籤 – saber 2012-01-15 05:53:59

回答

3

在WPF:假設你有一個名爲UserInfo類,它包含所需的有關當前登錄用戶的所有信息:

// You can use your Application.Current.Resources dictionary to store the 
// current logged-in user info. 
Application.Current.Resources["UserInfo"] = userInfo; 

然後你就可以在你的應用程序的任何地方獲取當前用戶信息對象用下面的代碼:

var userInfo = Application.Current.Resources["UserInfo"] as UserInfo; 
+1

好點,但我認爲*這個問題更多的是關於你是否應該使用單例,而不是如何實現它。不過,我同意,在WPF中這是一個很好的方法,因爲這意味着你可以在XAML中綁定到你的UserInfo。 +1 – ColinE 2012-01-15 07:02:30

+0

由於可測試性問題,我通常避免使用Singleton類,而且它增加了代碼的複雜性。在我看來,使用Application.Resources字典對象更容易,更簡單+它是可測試的:D – 2012-01-15 07:07:58

3

你所建議的是存儲一個singleton中的用戶信息。這是在桌面應用程序中常用的一種衆所周知的模式。也有很多相關的單例模式,它往往是令人難以接受的,恥辱的是由於一些缺點:

  • 可測性,如果你有沒有通過接口暴露單身是不可能的(或簡單)來測試你的代碼。
  • 可伸縮性,單身人士將永遠是一個單身人士,所以你不能在多個實例之間分擔這個責任 以允許你的應用程序擴展。這通常只是服務器端應用程序中的一個問題。在桌面上,這真的不適用
  • 併發性,你有多個線程訪問你的單身?如果是這樣,你需要讓它線程安全。

在您的上下文中的桌面應用程序中,上面可能會成爲問題的唯一一個是可測試性。在這種情況下,只需定義一個IUser接口,你就很好。

總之,這是好的。過去我多次使用過這種模式。