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系统:
-
解开.NET 2.0configuration的奥秘
-
解码.NET 2.0configuration的奥秘
-
破解.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消息。
你可以在这里看到/下载课程:
要了解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部分中不直接支持