我应该将C#App.config用于我的自定义应用程序设置吗



我需要在配置文件中存储一些设置(连接字符串、文件夹路径)。

我应该使用App.config吗?

看起来很明显,但是。。。。

1) 应用程序。包含一些.NET配置内容(包、versiosn等),我不希望任何人能够接触到这些内容——我宁愿总是将这些内容编译到程序中。

2) 将我的开发模式配置设置编译到程序中,并在App.config丢失时调用(默认为内置资源或其他),感觉很奇怪

3) 我喜欢干净的配置文件,这样我就可以一目了然地知道设置是什么(而且我有强迫症)?

是的,将其全部填充到app.config中。我的理由是,app.config中的任何内容都不可由最终用户编辑,即使是只有最终用户知道的那些位(连接字符串和文件夹路径)。你想要一个不懂电脑的人用记事本编辑XML文件吗?我知道我没有。

将最终用户值输入app.config的唯一可靠方法是在安装过程中提示用户输入这些值,并将其作为自定义操作自行编写。

是的,这是最佳实践,可以防止人们重新编译应用程序来进行基本的配置更改:例如,新用户需要收到一封自动电子邮件,更改配置文件比重新编译和重新部署应用程序容易得多。关于配置文件问题,这里有一个优雅的解决方案:http://www.hanselman.com/blog/ManagingMultipleConfigurationFileEnvironmentsWithPreBuildEvents.aspx

我更喜欢重命名文件,或者保留注释字符串,这取决于我从开发到生产需要做多少工作。

我对*.config文件的规则是,当我希望能够在不重新部署二进制文件的情况下更改设置时,使用它们。如果我不关心需要部署来进行更改,那么我将使用常量。如果我有疑问,我会使用配置文件。我几乎总是使用配置文件。

当我使用*.config时,我将通过另一个"Configuration"类公开这些值,该类为我想要公开的每个值都有一个静态只读属性。即,如果我的应用程序配置有设置

<add key="ServerLoadTime" value="-30" />

那么我的配置类可能看起来像:

public static class Configuration
{
    /// <summary>
    /// Get the number of minutes before prior to the event that the server is started.
    /// </summary>
    public static int ServerLoadTime
    {
        get
        {
            if (ConfigurationManager.AppSettings["ServerLoadTime"] != null)
                return int.Parse(ConfigurationManager.AppSettings["ServerLoadTime"]);
            Logging.Write("ServerLoadTime is missing from the Configuration file.", EventLogEntryType.Warning, Logging.Sources.General, "Configuration.ServerLoadTime", null);
            return -30; // return a default value.
        }
    }

}

这种方法创建了一个标准化封装,提供:

  • 一种快速引用值的方法,无需经过CM和检查有效性
  • 用于处理配置错误的值/缺失值的曲面
  • 将来自配置文件的字符串强制转换为所需类型的位置
  • 一个记录缺失值的地方,同时仍然提供默认的最后手段
  • 如果需要,将逻辑附加到结果的处理位置

相关内容

  • 没有找到相关文章

最新更新