簡體   English   中英

AppSettings 與 applicationSettings (.NET app.config / Web.config) 的優缺點

[英]Pros and cons of AppSettings vs applicationSettings (.NET app.config / Web.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>

基本的<appSettings>更容易處理 - 只需<add key="...." value="..." />一個<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 中的配置系統。

應用程序設置可以由設計器控制(默認情況下通常有一個 Settings.settings 文件),因此它更容易修改,您可以通過 Settings 類以編程方式訪問它們,它們看起來像強類型屬性。 您還可以擁有應用程序和用戶級別設置,以及用於回滾的默認設置。

這可以從 .NET 2.0 開始使用,並棄用了其他方式(據我所知)。

更多詳細信息見: msdn.microsoft.com/en-us/library/k4s6c3a0.aspx

要了解的設置中的利弊app.config ,我建議你看看雙方的技術細節。 我已經包含了一些鏈接,您可以在其中找到處理的源代碼,在下面描述了更多的技術細節。

讓我簡要總結一下我在與他們合作時認識到的內容(注意:這同樣適用於網站/Web 應用程序的web.config文件):


.NET 中的應用程序設置
(點擊上方查看源代碼和技術細節)


優點

  • 它們允許存儲類型化數據,包括對象類型(通過serializeAs屬性)

  • 它們有用戶和應用程序范圍,允許存儲默認值

  • Visual Studio 的配置部分支持它們

  • 長字符串和/或帶有特殊字符的數據得到很好的支持(例如,包含雙引號的嵌入式 JSON 字符串)


缺點

  • 用戶設置存儲在用戶配置文件中的不同位置(帶有神秘路徑),可能難以清理

  • 應用程序范圍設置在應用程序運行期間是只讀的(在運行期間只能更改用戶范圍設置)

  • 由 Visual Studio 的設置設計器構建的讀取/寫入方法代碼,而不是由 3rd 方工具直接提供(請參閱上面的鏈接以獲取解決方法)


.NET 中的應用設置
更新: .NET Core 中的 AppSettings
(點擊上方查看源代碼和技術細節)


優點

  • 是“輕量級的”,即易於處理

  • 應用程序運行期間的讀寫訪問

  • 管理員可以輕松編輯它們
    Internet 信息服務 (IIS) 管理器
    (Features View -> Application Settings,注意圖標的名字有誤導性,因為它只能處理AppSettings,不能處理ApplicationSettings)


缺點

  • 僅支持字符串數據; 字符串長度和特殊字符有限制

  • 他們沒有用戶范圍

  • 他們不支持默認值

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


我一直在使用我不久前發現的一種模式,您使用基本的 xml 標簽但將設置包裝在靜態配置類中。 所以 - 一個 DIY App.Settings。

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
    }

我喜歡使用更簡單的版本來存儲和訪問單個值。

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

我編寫了一個實用程序類,以允許默認值的類型安全方式訪問值。 如果未提供默認值,則會給出有用的異常消息。

您可以在此處查看/下載課程:

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

使用 ApplicationSettings 的一大好處是當應用程序通過 ClickOnce 部署時,如本頁中詳細說明的那樣。

基本上,如果設置的類型為 User 並且已從其默認值進行修改,則它會在每次更新時保持修改狀態。 如果設置的類型為應用程序,則更新應用程序時將自動覆蓋該設置。

此外,在 VB.NET 中,只需使用 My.Settings 即可訪問 ApplicationSettings。 從 GUI 的角度來看,使其成為最簡單的設置位置。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM