2013-02-14 58 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