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


166

在开发.NET Windows Forms Application时,我们可以在这些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>

在他们使用的MS的示例代码的appSettings msdn.microsoft.com/en-us/library/...这一点,我感到迷惑:(
亨特

找到这篇文章codeproject.com/KB/files/…似乎暗示着appSettings是用于w / r的,而applicationSettings是只读的。
狩猎


请注意,这同样适用于web.config,因此我向此问题添加了web.config标记。
马特

Answers:


151

基本<appSettings>内容更易于处理-只需在<add key="...." value="..." />条目中打一巴就可以完成。

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

而且,随着时间的流逝,<appSettings>如果您的应用程序的很多部分开始在其中放置内容(可能还记得旧的windows.ini文件?

如果可以的话,我希望并建议您使用自己的配置节-与.NET 2.0一起,这真的变得非常容易,这样,您可以:

  • a)在代码中定义您的配置设置,并进行类型安全和检查
  • b)您可以将您的设置与其他所有人完全区分开。您也可以重用您的配置代码!

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

  1. 揭开.NET 2.0配置之谜

  2. 解码.NET 2.0配置的奥秘

  3. 揭开.NET 2.0配置之谜

强烈推荐!Jon Rista出色地解释了.NET 2.0中的配置系统。


2
我发现applicationSettings易于添加编辑和删除设置,而且您不必编写任何代码,而且它们是类型安全的,而且您可以将它们的作用域设置为用户或应用程序,因为您可以仅使用项目的“设置”标签VS中的属性。
markmnl 2014年

20

可以从设计者控制应用程序设置(默认情况下通常有一个Settings.settings文件),因此可以轻松修改该设置,并且可以通过Settings类以编程方式访问它们,在该类中它们看起来像是强类型属性。您还可以具有应用程序和用户级别的设置,以及用于回滚的默认设置。

从.NET 2.0开始,这是可用的,并且不赞成这样做(据我所知)。

有关更多详细信息,请访问:msdn.microsoft.com/en-us/library/k4s6c3a0.aspx


14

我一直在使用一种模式,前一段时间我在这里使用了基本的xml标记,但是将设置包装在一个静态配置类中。因此-DIY应用程序设置。

DotNetPearls静态配置模式

如果以这种方式这样做,则可以:

  • 针对不同的环境(开发,测试,生产)使用不同的配置值集
  • 为每个设置提供合理的默认值
  • 控制如何定义和实例化值

设置起来很麻烦,但是性能很好,隐藏了对键名的引用,并且类型强。这种模式适用于应用程序不会更改的配置,尽管您可能也可以支持更改。

配置:

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

11

要了解优点缺点的设置app.config,我建议你看看双方的技术细节。我提供了一些链接,您可以在其中找到要处理的源代码,并在下面介绍更多技术细节。

让我简要总结一下与他们一起工作时所认识的内容(注意:这同样适用于web.config网站/ Web应用程序的文件):


.NET中的applicationSettings
(单击上方以查看源代码和技术详细信息)


优点

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

  • 它们具有用户和应用程序范围,允许存储默认值

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

  • 很好地支持长字符串和/或带有特殊字符的数据(例如,包含双引号的嵌入式JSON字符串)


缺点

  • 用户设置存储在用户配置文件中的其他位置(带有隐秘路径),可能难以清除

  • 应用程序作用域设置在应用程序运行时为只读(在运行时只能更改用户作用域设置)

  • 由Visual Studio的设置设计器构建的读/写方法代码,不是由第三方工具直接提供的(有关变通方法,请参见上面的链接)


.NET
更新中的 AppSettings .NET Core中的AppSettings
(单击上方以查看源代码和技术详细信息)


优点

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

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

  • 管理员可以在
    Internet信息服务(IIS)管理器中 轻松编辑它们
    (功能视图->应用程序设置,请注意,图标的名称具有误导性,因为它只能处理AppSettings,而不能处理ApplicationSettings)


缺点

  • 仅支持字符串数据;字符串长度和特殊字符受到限制

  • 他们没有用户范围

  • 他们不支持默认值

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



9

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

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

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

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

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


3
+1,更简单,特别是如果您有多个程序集(设置通常每个程序集都有一个节)。我有一个类似的助手班。顺便说一句,您的班级目前希望配置文件使用对文化敏感的字符串,这不是一件好事,例如应为“ Double.TryParse(s,NumberStyles.Any,CultureInfo.InvariantCulture,out result)”,而不是“ Double.TryParse( s,超出结果)”。同样对于nitpick,MS编码指南建议使用GetInt32,GetInt16,GetBoolean,而不是GetInt,GetShort,GetBool。

很好,但不能回答有关AppSettings的优缺点的问题。
马特

@Matt,优点是比较简单。缺点是它比较简单。如果您只需要几个文字值(布尔值,整数,字符串等),则此方法可带来最大的收益。如果您需要结构化数据,名称空间分隔,XSD支持的验证/完成等功能,那么自定义部分可能更合适。另一个选择是App.config完全忽略该文件并使用您自己的配置文件。很多图书馆都这样做。NLog浮现在脑海。
德鲁·诺阿克斯

@DrewNoakes-我同意你的看法。感谢您的澄清。
马特
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.