我需要在配置文件中存储一些设置(连接字符串、文件夹路径)。
我应该使用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和检查有效性
- 用于处理配置错误的值/缺失值的曲面
- 将来自配置文件的字符串强制转换为所需类型的位置
- 一个记录缺失值的地方,同时仍然提供默认的最后手段
- 如果需要,将逻辑附加到结果的处理位置