直接使用设置或通过包装类?

时间:2010-12-31 11:06:16

标签: c# winforms singleton settings

参考.NET设置机制,并受到this问题的几个答案的启发,似乎有些人主张通过另一个包装类(可能是单例)来包装Settings。

设置类不是单身人士吗?

[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "9.0.0.0")]
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {

    private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));

    public static Settings Default {
        get {
            return defaultInstance;
        }
    }
// rest of class...
}




那么,在另一个类中包装Settings并执行此操作的好处是什么:

int foo = MySettingsWrapper.MyInt;

而不是直接在需要的地方执行此操作:

int foo = Settings.Default.MyInt;

3 个答案:

答案 0 :(得分:2)

Settings类本身不是单身。你可以这样做:

var s1 = new Settings();
var s2 = new Settings();
var s3 = new Settings();

但是,我相信这对你没有多大帮助,因为AFAIK s1s2s3的值都将保留在同一个地方:

c:\Documents and Settings>\<username>\[Local Settings\]Application Data\<companyname>\<appdomainname>_<eid>_<hash>\<verison>\user.config

所以我怀疑:

s1.MyInt = 1;
s1.Save();

相同
s2.MyInt = 1;
s2.save();

因此,您将获得Settings.Default静态属性,该属性返回单个线程安全实例。我一直都在使用它,没有看到任何理由包装它。但是,您可能希望扩展,例如,如果您想控制user.config的位置:How to make designer generated .Net application settings portable

答案 1 :(得分:1)

它是一种依赖注入。

Settings.Default是一种设置机制的实现类型。

添加包装器意味着实现代码位于一个位置,而不是代码中。

将该文件替换为另一个实现很容易,而无需更改代码。

可能有点矫枉过正。您需要决定是否需要更换该实现。但想想看,您可能会发现可能需要访问这些设置的其他系统(SQL作业,远程服务等)。

通常这个“包装器”应该是接口的实现,并且您将使用控件容器的反转(例如Castle.Windsor)将实现注入到运行时环境中。

答案 2 :(得分:0)

我认为使用基于接口的类包装Settings类的主要好处是有助于单元测试:避免文件I / O,设置文件位置问题,启用依赖注入。