存储单例类实例的最佳位置在哪里? 比方说,我有一个配置类(它为应用程序加载全局设置),也许是一个访问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");
这有什么问题,或者最好的方法是什么? 谢谢!
答案 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的代码中实现一些可测试性。