保持单例实例的最佳位置

时间:2012-07-16 00:32:35

标签: c# windows-mobile singleton

存储单例类实例的最佳位置在哪里? 比方说,我有一个配置类(它为应用程序加载全局设置),也许是一个访问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");

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

2 个答案:

答案 0 :(得分: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;

虽然显然这是可选的。

希望有所帮助。

答案 1 :(得分:1)

你错过了Singleton模式的观点。你不存储对单身人士的引用,因为它只是一个单一的引用,由Singleton控制。

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

单身人士本身就有点气味,他们本质上打破了控制倒置,使代码更难以测试。在我遇到Singletons和Static Classes的遗留应用程序中,我倾向于修改它们以扩展接口。 (即ISettings)暴露了所需的行为,然后将类似延迟加载的依赖项用于想要访问它的类:

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

这允许您的测试用存根/模拟替换设置。它默认为Singleton。它是一个有效的,轻量级的重新因子,可以在依赖于Singletons和Statics的代码中实现一些可测试性。