4

我有一个单例类,它正在读取配置文件。

public sealed class SettingsHelper
    {
        private static readonly SettingsHelper _Instance = new SettingsHelper();

        static SettingsHelper()
        {
        }

        public static SettingsHelper Instance
        {
            get
            {
                return _Instance;
            }
        }

        private NameValueCollection _SettingsSection = null;

        public SettingsHelper()
        {
            _SettingsSection = new NameValueCollection(ConfigurationManager.AppSettings);           
        }

        .....
    }
}

但是,如果配置文件被更改,单身人士不会接受更改。有没有办法重新创建单例实例(调用它的构造函数)或者我应该创建单独的方法来重新启动单例实例?

4

3 回答 3

3

您正试图抛弃单例模式的第一个目的。那里有一个单例,只是为了防止任何其他代码实例化该类的新实例。要创建一个单例类,您根本不应该有公共构造函数。您已经有一个公共构造函数。

我鼓励你阅读第一行,也就是这篇关于单例模式的维基百科文章的第一行。

您正在尝试做的事情在 C# 中称为缓存依赖项。您正在尝试缓存 Web.config 的应用程序设置,并且您依赖于 Web.config 的更改。你应该搜索那个。

于 2013-11-13T06:14:58.980 回答
1

重新创建一个单例是一个坏主意 - 对“旧”单例的引用将保留。
所以它不再是单身狗了!

在您的情况下,我将创建新设置。为什么不创建一个公共方法LoadSettings() 并调用它呢?

public sealed class SettingsHelper
{
    private static readonly SettingsHelper _Instance = new SettingsHelper();
    private NameValueCollection _SettingsSection = null;

    // ...

    private SettingsHelper()
    {
        LoadSettings()
    } 


    public void LoadSettings()
    {
        _SettingsSection = new NameValueCollection(ConfigurationManager.AppSettings);           
    }

    .....
}

}

顺便说一句:SettingsHelper()私人...

于 2013-11-13T06:05:49.977 回答
1

最好在单例类中创建一个单独的方法来再次读取设置。显然,使用这种方法,您将不得不从代码中调用此方法。

于 2013-11-13T06:03:38.607 回答