2009-01-20 63 views
146

在開發.NET Windows窗體應用程序時,我們可以在這些App.config標記之間進行選擇以存儲我們的配置值。哪一個更好?AppSettings vs applicationSettings的優缺點(.NET app.config/Web.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> 
+0

在MS示例代碼中,他們使用appSettings http://msdn.microsoft.com/en-us/library/system.configuration.configurationmanager.aspx這讓我感到困惑:( – Hunt 2012-02-03 11:59:22

+0

發現這篇文章http://www.codeproject.com/KB/files/SaveConnStringInAppConfig.aspx?q=working+with+applicationsettings+c%23它似乎暗示appSettings是爲W/R applicationSettings是隻讀的。 – Hunt 2012-02-11 15:11:51

+0

另一篇相關的文章http://stackoverflow.com/questions/453161/best-practice-to-save-application-settings-in-a-windows-application – Hunt 2012-02-11 15:34:36

回答

136

基本<appSettings>是容易對付 - 只是拍在<add key="...." value="..." />條目,就大功告成了。

缺點是:沒有類型檢查,例如,你不能安全地假設你想要配置的號碼真的是一個號碼 - 有人可以把一個字符串放入該設置.....你只需要訪問它作爲ConfigurationManager["(key)"],然後由你來知道你在處理什麼。

此外,隨着時間的推移,如果您的應用程序的很多部分開始在其中放置東西(請記住舊的windows.ini文件?:-)),那麼<appSettings>可能會變得相當複雜和混亂。

如果可以,我寧願和推薦使用自己的配置部分 - 用.NET 2.0,它真的變得很容易,這樣一來,您可以:

  • 一)在代碼中定義的配置設置並讓他們安全 並檢查
  • 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

強烈推薦! Jon Rista在.NET 2.0中解釋配置系統做得很好。

18

應用程序設置可以從一個設計師(通常有默認爲Settings.settings文件)進行控制,使得其更容易修改,你可以通過他們看起來像一個強類型屬性設置類編程方式訪問它們。您還可以擁有應用程序和用戶級別設置,以及用於回滾的默認設置。

這是從.NET 2.0開始提供的,並且棄用了另一種方法(據我所知)。

更多細節在給出:msdn.microsoft.com/en-us/library/k4s6c3a0.aspx

9

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

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

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

你可以看到/在這裏下載類:

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

12

我一直在使用,我發現了一段時間後,你用基本的XML標籤,但在一個靜態配置類包裝的設置模式。所以 - 一個DIY App.Settings。

DotNetPearls Static Config Pattern

如果你做這種方式,您可以:

  • 使用不同的設置爲不同的環境配置值(開發,測試,正式版)
  • 提供了合理的默認值各設定
  • 控制值如何定義和實例化

設置起來很麻煩但性能良好,隱藏對鍵名的引用,並且是強類型的。這種模式適用於未由應用程序更改的配置,儘管您也可能支持更改。

配置:

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

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

讓我簡要地總結一下我承認,當我與他們合作(注:同樣適用於web.config文件網站/網頁應用):


applicationSettings
(點擊上面的查看源代碼和技術細節)

優點

  • 它們允許以存儲輸入的數據,包括

  • 它們在視覺支持的對象類型(通過serializeAs屬性)

  • 他們有一個用戶和應用範圍,從而允許存儲默認值Studio的配置部分

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


缺點

  • 用戶設置存儲在用戶簡檔的不同的地方(具有隱蔽的路徑),可能難以清理

  • 應用程序範圍設置在應用程序運行時期間爲只讀(僅用戶範圍設置可在運行時更改)

  • 通過Visual Studio的設置設計師,不是直接由第三方工具提供內置

    讀/寫方法的代碼(見上面的鏈接的解決方法,解決方案)


AppSettings
(點擊上方查看源代碼和技術細節)

優點

  • 是「輕量級」,即好辦

  • 閱讀和應用程序的運行過程中寫入訪問

  • 他們可以很容易地通過管理員在
    Internet信息服務進行編輯(IIS)管理器
    (功能視圖 - >應用程序設置請注意,該圖標的名稱具有誤導性,因爲它只能處理的AppSettings,而不是的applicationSettings)


缺點

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

  • 他們沒有一個用戶範圍

  • 它們不支持默認值

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