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

时间:2009-01-20 11:38:38

标签: .net web-config app-config

在开发.NET Windows窗体应用程序时,我们可以在App.config个标记之间进行选择,以存储我们的配置值。哪一个更好?

<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>

5 个答案:

答案 0 :(得分:144)

基本的<appSettings>更容易处理 - 只需点击<add key="...." value="..." />条目即可完成。

缺点是:没有类型检查,例如你不能安全地假设你想要配置的号码确实有一个数字 - 有人可以在该设置中输入一个字符串.....你只需要访问它ConfigurationManager["(key)"]然后你就可以知道你是什么了正在处理。

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

如果可以,我更愿意并建议使用您自己的配置部分 - 使用.NET 2.0,它真的变得非常简单,这样,您可以:

  • a)在代码中定义配置设置并使其具有类型安全性 并检查
  • b)您可以将您的设置与所有人完全分开 别人的。您也可以重用您的配置代码!

有一系列非常好的文章可以揭开CodeProject上的.NET 2.0配置系统的神秘面纱:

  1. Unraveling the mysteries of .NET 2.0 configuration

  2. Decoding the mysteries of .NET 2.0 configuration

  3. Cracking the mysteries of .NET 2.0 configuration

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

答案 1 :(得分:20)

应用程序设置可以从设计器控制(默认情况下通常有一个Settings.settings文件),因此更容易修改,您可以通过Settings类以编程方式访问它们,它们看起来像一个强类型属性。您还可以拥有应用程序和用户级别设置,以及回滚的默认设置。

这可以从.NET 2.0开始提供,并且不赞成采用其他方式(据我所知)。

更多细节见:msdn.microsoft.com/en-us/library/k4s6c3a0.aspx

答案 2 :(得分:14)

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

DotNetPearls Static Config Pattern

如果你这样做,你可以:

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

设置但执行良好,隐藏对密钥名称的引用,并且是强类型的,这很繁琐。这种模式适用于未被应用程序更改的配置,尽管您也可以支持更改。

配置:

<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" />

配置类:

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
    }

答案 3 :(得分:9)

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

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

我编写了一个实用程序类,以类型安全的方式访问值,允许使用默认值。如果未提供默认值,则会给出有用的异常消息。

您可以在此处查看/下载课程:

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

答案 4 :(得分:0)

使用 ApplicationSettings 的一大好处是当应用程序通过 ClickOnce 部署时,如 this page 中详细说明的那样。

基本上,如果设置的类型为 User 并且已从其默认值进行修改,则它会在每次更新时保持修改状态。如果设置为应用程序类型,则在应用程序更新时将自动覆盖该设置。

此外,在 VB.NET 中,只需使用 My.Settings 即可访问 ApplicationSettings。使其成为从 GUI 角度可用的最简单的设置。