2013-02-14 77 views
2

假設我想使用自定義類來存儲用戶設置,並使用XML序列化來保存它。
程序啓動時,它將對XML文件進行反序列化。 我現在有一個包含所有用戶設置的類。表單之間的共享類

我怎樣才能分享這個類與所有其他形式的應用程序?
有沒有比作爲參數傳遞給構造函數更好的方法?

理想情況下我會使用一個靜態類,但這並沒有實例,所以它不是序列化。
我喜歡.NET屬性文件,它可以在任何地方訪問。
(不幸的是這僅允許對,這是不夠的 - 因此,我自己的XML文件)

編輯:

基於答案我現在有這樣的:

[Serializable] 
public sealed class UserSettings 
{ 
    private static readonly UserSettings _instance = new UserSettings(); 
    private string _FirstName; 
    private string _LastName;  

    public static UserSettings Instance 
    { 
     get 
     { 
      return _instance; 
     } 
    } 

    static UserSettings() 
    {    
    } 

    private UserSettings() 
    { 
     //Constructor 
    } 

    public string FirstName 
    { 
     get { return _FirstName; } 
     set { _FirstName = value; } 
    } 

    public string LastName 
    { 
     get { return _LastName; } 
     set { _LastName = value; } 
    }  
} 

我已經序列化並將包含值的此類的實例保存到文件中。
我使用此代碼加載:

private static void LoadUserSettings() 
    { 
     UserSettings us = UserSettings.Instance; 

     IFormatter formatter = new BinaryFormatter(); 
     Stream stream = new FileStream(_AppSettingsFilePath, FileMode.Open, FileAccess.Read, FileShare.Read); 
     us = (UserSettings)formatter.Deserialize(stream); 
     stream.Close(); 
     //System.Windows.Forms.MessageBox.Show(us.FirstName + " " + us.LastName); 
    } 


當我讀在LoadUserSettings功能(評論的最後一行)的屬性它顯示所保存的值。

然而,當我在運行Form_load中的代碼,該值是空的。 (其實一切都是NULL):

 LoadUserSettings(); 
     UserSettings us = UserSettings.Instance;      
     MessageBox.Show(us.FirstName + " " + us.LastName); 

我在做什麼錯?

+0

我喜歡它傳遞到構造函數。爲了簡化操作,請使用IOC容器(例如Unity,StructureMap等)。這將允許您保持您的代碼結構不變但自動注入值。的[分享多個形式之間的一類] – 2013-02-14 15:29:55

+2

可能重複(http://stackoverflow.com/questions/10325040/sharing-a-class-between-multiple-forms) – 2013-02-14 15:30:02

回答

2

,因爲它代表狀態在邏輯上是「全球性」,而不是東西,應該允許存在,你認爲它應該是靜態權作爲多個實例。既然你需要有一個實際的對象實例,這意味着適當的解決方案是使用一個單例。這會給你一個你可以序列化的實例,但是這個實例可以暴露在整個應用程序中,並且你可以肯定只會有一個實例。

2

是,使之成爲Singleton

public sealed class UserSettings 
{ 
    private static readonly UserSettings _instance = new UserSettings(); 
    public static UserSettings Instance 
    { 
     get 
     { 
      return _instance; 
     } 
    } 

    static UserSettings() 
    { 
    } 

    private UserSettings() 
    { 
     // do constructor logic here 
    } 
} 

,現在你可以像這樣訪問:

UserSettings.Instance.SomeProperty 
+0

你的單例模式不是線程安全的。 – Servy 2013-02-14 15:32:33

+0

@Servy,如果你不介意告訴我們你對它的全部理解,請修改。 – 2013-02-14 15:33:19

+0

完成,現在它是線程安全的。 – Servy 2013-02-14 15:35:02