AppSettings vs applicationSettings的优缺点(.NET app.config / Web.config)

在开发.NET Windows窗体应用程序时,我们可以select这些App.config标记来存储我们的configuration值。 哪一个更好?

 <configuration> <!-- Choice 1 --> <appSettings> <add key="RequestTimeoutInMilliseconds" value="10000"/> </appSettings> <!-- Choice 2 --> <configSections> <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c5612342342" > <section name="Project1.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c5612342342" requirePermission="false" /> </sectionGroup> </configSections> <applicationSettings> <Project1.Properties.Settings> <setting name="TABLEA" serializeAs="String"> <value>TABLEA</value> </setting> </Project1.Properties.Settings> </applicationSettings> </configuration> 

基本的<appSettings>更容易处理 – 只需在<add key="...." value="..." />条目中敲击即可。

缺点是:没有types检查,例如,你不能安全地假设你想要configuration的号码真的是一个号码 – 有人可以把一个string进入设置…..你只需要它作为ConfigurationManager["(key)"] ,然后由你来知道你在处理什么。

而且,随着时间的推移,如果你的应用程序的很多部分开始在那里放置东西(记得旧的windows.ini文件,那么<appSettings>可能会变得相当复杂和混乱)。

如果可以的话,我更喜欢和推荐使用你自己的configuration部分 – 与.NET 2.0,它真的变得很容易,这样,你可以:

  • a)在代码中定义您的configuration设置并让它们types安全并被检查
  • b)您可以干净地将您的设置与其他人分开。 你也可以重复使用你的configuration代码!

有一系列非常好的文章可以帮助你理解CodeProject上的.NET 2.0configuration系统:

  1. 解开.NET 2.0configuration的奥秘

  2. 解码.NET 2.0configuration的奥秘

  3. 破解.NET 2.0configuration的奥秘

强烈推荐! Jon Rista在.NET 2.0中解释了configuration系统做得很好。

应用程序设置可以由devise者控制(默认情况下通常是一个Settings.settings文件),所以更容易修改,并且可以通过Settings类来以编程方式访问它们,这些设置类似于强types属性。 您还可以拥有应用程序和用户级别设置,以及回滚的默认设置。

这是可以从.NET 2.0以上,并弃用其他方式(据我所知)。

更多详细信息在: msdn.microsoft.com/en-us/library/k4s6c3a0.aspx

我一直在使用我发现的模式,在那里你使用基本的XML标签,但将设置包装在一个静态的configuration类。 所以 – 一个DIY的App.Settings。

DotNetPearls静态configuration模式

如果你这样做,你可以:

  • 对不同的环境使用不同的configuration值(dev,test,prod)
  • 为每个设置提供合理的默认值
  • 控制如何定义和实例化值

设置起来很麻烦但性能良好,隐藏对键名称的引用,并且是强types的。 这种模式适用于不被应用程序改变的configuration,尽pipe你也可能支持更改。

configuration:

 <add key="machineName" value="Prod" /> <add key="anotherMachineName" value="Test" /> <add key="EnvTypeDefault" value="Dev" /> <add key="RootURLProd" value="http://domain.com/app/" /> <add key="RootURLTest" value="http://test.domain.com/app/" /> <add key="RootURLDev" value="http://localhost/app/" /> <add key="HumanReadableEnvTypeProd" value="" /> <add key="HumanReadableEnvTypeTest" value="Test Mode" /> <add key="HumanReadableEnvTypeDev" value="Development Mode" /> 

configuration类:

 using System; using System.Collections.Generic; using System.Web; using WebConfig = System.Web.Configuration.WebConfigurationManager; public static class Config { #region Properties public static string EnvironmentType { get; private set; } public static Uri RootURL { get; private set; } public static string HumanReadableEnvType { get; private set; } #endregion #region CTOR /// <summary> /// Initializes all settings when the app spins up /// </summary> static Config() { // Init all settings here to prevent repeated NameValueCollection lookups // Can increase performance on high volume apps EnvironmentType = WebConfig.AppSettings[System.Environment.MachineName] ?? "Dev"; RootURL = new Uri(WebConfig.AppSettings["RootURL" + EnvironmentType]); HumanReadableEnvType = WebConfig.AppSettings["HumanReadableEnvType" + Config.EnvironmentType] ?? string.Empty; } #endregion } 

我喜欢使用更简单的版本来存储和访问单个值。

 <appSettings> <add key="MyConfigKey" value="true"/> </appSettings> 

我写了一个实用程序类来访问值的types安全的方式,允许默认值。 如果未提供默认值,则会提供有用的exception消息。

你可以在这里看到/下载课程:

http://www.drewnoakes.com/code/util/app-settings-util/

要了解app.config中设置的优缺点 ,我build议您查看两者的技术细节。 我已经包含了链接,你可以find处理的源代码,在下面描述更多的技术细节。

让我简要总结一下我在使用它们时识别出来的东西( 注意:同样适用于web站点/ web应用程序的web.config文件):


应用程序设置
(点击上方查看源代码和技术细节)

优点

  • 它们允许存储types化数据,包括对象types(通过serializeAs属性)

  • 他们有一个用户和应用程序范围,允许存储默认值

  • 它们在Visual Studio的configuration部分中受支持

缺点

  • 用户设置存储在用户configuration文件中的不同位置(具有神秘的path),可能难以清理

  • 应用程序范围设置在应用程序运行时是只读的(只能在运行时更改用户范围设置)

  • 由Visual Studio的设置devise器构build的读/写方法代码,不是由第三方工具直接提供的(请参阅上面的链接以获得解决方法)


的AppSettings
(点击上方查看源代码和技术细节)

优点

  • 是“轻量级”,即易于处理

  • 在应用程序运行时读写访问

  • 他们可以很容易地编辑pipe理员在
    Internet信息服务(IIS)pipe理器
    (function视图 – >应用程序设置,请注意,图标的名称是误导,因为它只能处理AppSettings而不是ApplicationSettings)

缺点

  • 仅支持string数据

  • 他们没有用户范围

  • 他们不支持默认值

  • 在Visual Studio的configuration部分中不直接支持