【问题标题】:Use Settings directly or via a wrapper class?直接使用设置还是通过包装类?
【发布时间】:2011-06-01 23:11:13
【问题描述】:

参考 .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...
}

.
.
.
那么,将设置包装在另一个类中并这样做有什么好处:

int foo = MySettingsWrapper.MyInt;

而不是在需要的地方直接这样做:

int foo = Settings.Default.MyInt;

【问题讨论】:

    标签: c# winforms singleton settings


    【解决方案1】:

    它是一种依赖注入。

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

    添加包装器意味着实现代码在一个地方,而不是跨代码。

    无需更改代码即可轻松将该文件换成另一个实现。

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

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

    【讨论】:

      【解决方案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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 2012-01-24
          • 2012-03-10
          • 2011-09-17
          • 2017-09-24
          • 2013-09-01
          • 1970-01-01
          • 1970-01-01
          • 2019-12-18
          • 1970-01-01
          相关资源
          最近更新 更多