2009-08-10 68 views
3

我知道這一定是一個古老而疲憊的問題,但我似乎無法通過我的可信賴的朋友(又名Google)找到任何東西。Winforms:在整個應用程序中訪問類屬性

我有一個.NET 3.5的C#WinForms應用程序,呈現與應用程序啓動時登錄表單的用戶。成功登錄後,我要逃跑到數據庫中,一些用戶特定的數據拉,並把它們(在屬性)在一個叫AppCurrentUser.cs類,可隨後上可以在所有課程中的裝配訪問 - 這裏的目的是我可以用一次性的數據讀取來填充一些屬性,而不是每次需要時都調用數據庫。在Web應用程序中,我通常會使用會話變量,並且我知道WinForms中不存在該概念。

類結構如下所示:

public class AppCurrentUser { 

    public AppCurrentUser() { } 

    public Guid UserName { get; set; } 
    public List<string> Roles { get; set; } 
    public string Firstname { get; set; } 
    public string Lastname { get; set; } 
} 

現在,我有一些我需要一些專家的意見選擇:

是一個「啞巴」類,我應該做的屬性非靜態的,實例化類,然後設置屬性......但是,我只能從它創建的類中訪問該實例,對吧?

從邏輯上講,我認爲,這些屬性應該是靜態的,因爲我將只使用類一次整個應用程序(和創造它的新實例),它的屬性值將被「復位」上申請關閉。 (如果我創建它的一個實例,我可以在應用程序關閉處理掉吧)

我應該如何構建我的課怎麼辦我訪問它的屬性在所有課程中我的組裝?我真的很感謝你對此的誠實和有價值的建議!

謝謝!

回答

5

這裏使用Singleton模式:

public class AppUser 
{ 
    private static _current = null; 
    public static AppUser Current 
    { 
     get { return = _current; } 
    } 

    public static void Init() 
    { 
     if (_current == null) 
     { 
      _current = new AppUser(); 
      // Load everything from the DB. 
      // Name = Dd.GetName(); 
     } 
    } 

    public string Name { get; private set; } 
} 

// App startup. 
AppUser.Init(); 

// Now any form/class/whatever can simply do: 
var name = AppUser.Current.Name; 

現在的 「靜態」 的事情是線程安全的。我將把它作爲讀者的練習來解決如何正確使用lock()語法使其成爲線程安全的。如果在調用Init之前訪問Current屬性,您還應該處理這種情況。

1

這取決於你如何設置架構。如果你做你所有的業務邏輯代碼的實際表單中(例如,它連接到UI),那麼你可能想傳遞用戶信息作爲參數,當你犯了一個表格,然後從內保持對它的引用形成。換句話說,你會實施Singleton模式。

您也可以使用依賴注入,以便每次請求用戶對象時,依賴注入框架(如StructureMap)將爲您提供正確的對象。 - 你可以像使用會話變量一樣使用它,因爲你將在有狀態的環境中工作。

+0

嗨!謝謝回覆!不,我的BL在一個單獨的類中,並從UI中調用。此外,我有效與我的靜態與非靜態參數? – Shalan 2009-08-10 23:03:45

+0

立即閱讀StructureMap – Shalan 2009-08-10 23:05:59

+0

我會說DI在這裏是過度殺傷。 Shalan聽起來像他可能是一個初學者,應該避免依賴注入,直到像Singleton Pattern這樣的更基本的概念 - 如你所說 - 更好地掌握。 – xanadont 2009-08-10 23:14:07

0

儲存這類信息的正確位置應該是在的IIdentity的自定義實現。您需要識別用戶或其訪問權限的任何信息都可以存儲在該對象中,然後該對象與當前線程相關聯,並且可以在需要時從當前線程查詢。

此校長在Rocky Lhotka's CLSA books或谷歌winforms自定義標識說明。

0

我不相信這是正確的方式,但你可以做這樣的事情(好像是你在問什麼反正):

public class Sessions 
{ 
    // Variables 
    private static string _Username; 

    // properties 
    public static string Username 
    { 
     get 
     { 
      return _Username; 
     } 
     set 
     { 
      _Username = value; 
     } 
    } 
} 

的情況下,C#是錯誤的...我是一個vb.net開發者...

那麼你只是使用Sessions.USername等等等

+0

靜態屬性引入線程問題,應予以解決。 – xanadont 2009-08-10 23:15:48