2

存储单例类实例的最佳位置在哪里?比如说我有一个配置类(它为应用程序加载全局设置),也许还有一个访问 Web 服务的类,我不确定在哪里实例化和保存它们的最佳位置。

目前,我将它们作为 Program 类的实例(从中调用 Application.Run),它似乎工作正常,但我不确定这是否是最好的方法!...

static class Program
{
    public static string dbConnectString = "Data Source=" + 
        Path.GetDirectoryName(Assembly.GetExecutingAssembly().GetName().CodeBase) + 
        @"\xxx.sdf" + ";Persist Security Info=False";
    public static Settings settings = null;

    [MTAThread]
    static void Main()
    {
        settings = Settings.Instance;
        Application.Run(new MainMenu());
    }
}

在整个应用程序中,我这样称呼它:

txtWebServiceUrl.Text = Program.settings.getSetting("web_service_url");

这有什么问题吗,或者最好的方法是什么?谢谢!

4

2 回答 2

3

我个人会让它们变得漂亮且易于使用 - 将它们放在“设置”或“全局”类中。哦,如果可能的话,我会有属性 [或枚举] 来访问设置而不是字符串键,因此当你打错字时,智能感知可以让你头晕目眩。

public static class Settings
{
    static Dictionary<string,string> data = new Dictionary<string,string>();

    public static string WebServiceUrl {get {return data["web_service_url"];}}
}

像这样使用:

 txtWebServiceUrl.Text = Settings.WebServiceUrl;

尽管显然这是可选的。

希望有帮助。

于 2012-07-16T00:45:56.373 回答
1

您错过了单例模式的要点。您不存储对 Singleton 的引用,因为只有一个引用,由 Singleton 控制。

该模式适用于您需要使用单例的任何地方,您可以通过它的单个实例引用它,在您的情况下是:Settings.Instance。

单例本身就有点味道,因为它们本质上会破坏控制反转,使代码更难测试。在我遇到单例和静态类的遗留应用程序中,我倾向于修改它们以扩展接口。(即 ISettings),它公开了所需的行为,然后在想要访问它的类中使用诸如延迟加载依赖项之类的东西:

private ISettings _settings;
public ISettings Settings
{
  get { return _settings ?? Settings.Instance;}
  set { _settings = value; }
}

这允许您的测试用存根/模拟替换设置。它默认为单例。它是一种有效的、轻量级的重构,可以在依赖于单例和静态的代码中实现一些可测试性。

于 2012-07-16T04:51:08.323 回答