AppSettings ile applicationSettings (.NET app.config / Web.config) artıları ve eksileri


167

Bir .NET Windows Forms Uygulaması geliştirirken App.config, yapılandırma değerlerimizi saklamak için bu etiketler arasında seçim yapabiliriz . Hangisi daha iyi?

<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 örnek kodunda onlar appSettings msdn.microsoft.com/en-us/library/… kullanın bu kafa karıştırıcı buluyorum :(
Hunt

Bu makaleyi buldum codeproject.com/KB/files/… appSettings uygulama için w / r için olduğu anlamına geliyor gibi görünüyorSettings salt okunur içindir.
Hunt

Alakalı başka bir makale stackoverflow.com/questions/453161/…
Hunt

Aynı şeyin web.config için de geçerli olduğunu unutmayın , bu nedenle bu soruya web.config etiketini ekledim.
Matt

Yanıtlar:


151

Temel <appSettings>ile başa çıkmak daha kolaydır - sadece bir <add key="...." value="..." />girişe tokat atın ve işiniz bitti.

Dezavantajı: tip kontrolü yoktur, örneğin numaranızı gerçekten yapılandırmak istediğiniz bir sayı olduğunu varsayamazsınız ConfigurationManager["(key)"]. neyle uğraştığınızı bilmek için size.

Ayrıca, <appSettings>uygulamanızın birçok bölümü orada şeyler koymaya başlarsa , zamanla oldukça kıvrımlı ve dağınık olabilir (eski windows.ini dosyasını hatırlıyor musunuz? :-)).

Yapabiliyorsanız, kendi yapılandırma bölümlerinizi kullanmayı tercih ederim ve tavsiye ederim - .NET 2.0 ile gerçekten oldukça kolaylaştı, Bu şekilde şunları yapabilirsiniz:

  • a) Yapılandırma ayarlarınızı kodda tanımlayın ve yazım güvenli ve kontrol ettirin
  • b) SİZİN ayarlarınızı herkesin ayarlarından temiz bir şekilde ayırabilirsiniz . Ayrıca yapılandırma kodunuzu da yeniden kullanabilirsiniz!

CodeProject üzerinde .NET 2.0 yapılandırma sistemini açıklığa kavuşturmak için bir dizi gerçekten iyi makale var:

  1. .NET 2.0 yapılandırmasının gizemlerini çözme

  2. .NET 2.0 yapılandırmasının gizemlerini çözme

  3. .NET 2.0 yapılandırmasının gizemlerini kırma

Şiddetle tavsiye edilir! Jon Rista, .NET 2.0'daki yapılandırma sistemini açıklayan harika bir iş çıkardı.


2
Ayarları bulmayı ve düzenlemeyi kaldırmayı daha kolay buluyorum artı bir kod satırı yazmak zorunda değilsiniz, ayrıca bunlar güvenli yazıyor, ayrıca bunları kullanıcı veya uygulamaya da ekleyebilirsiniz, çünkü projenizdeki Ayarlar sekmesini kullanabilirsiniz VS özellikleri.
markmnl

20

Uygulama ayarları bir tasarımcıdan kontrol edilebilir (varsayılan olarak bir Settings.settings dosyası vardır), bu nedenle değiştirilmesi daha kolaydır ve bunlara, güçlü bir şekilde yazılmış bir özellik gibi göründükleri Settings sınıfı aracılığıyla programlı olarak erişebilirsiniz. Ayrıca uygulama ve kullanıcı düzeyi ayarlarının yanı sıra geri alma için varsayılan ayarlara da sahip olabilirsiniz.

Bu, .NET 2.0'dan itibaren kullanılabilir ve bunu yapmanın diğer yolunu (anlayabildiğim kadarıyla) ortadan kaldırır.

Daha ayrıntılı bilgi için: msdn.microsoft.com/en-us/library/k4s6c3a0.aspx


14

Ben temel xml etiketleri kullanın ama ayarları statik bir yapılandırma sınıfında sarın bir süre geri buldum bir desen kullanıyorum. Yani - bir DIY Uygulaması Ayarları.

DotNetPearls Statik Yapılandırma Deseni

Bu şekilde yaparsanız şunları yapabilirsiniz:

  • farklı ortamlar için farklı yapılandırma değerleri kümeleri kullanma (dev, test, prod)
  • her ayar için makul varsayılanlar sağlayın
  • değerlerin nasıl tanımlandığını ve somutlaştırıldığını kontrol edin

Ayarlamak sıkıcıdır, ancak iyi performans gösterir, anahtar adlarına referansları gizler ve güçlü bir şekilde yazılmıştır. Bu tür bir desen, uygulama tarafından değiştirilmeyen yapılandırma için iyi çalışır, ancak muhtemelen değişiklikler için destekte de çalışabilirsiniz.

Yapılandırma:

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

Yapılandırma sınıfı:

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

İçindeki ayarların artılarını ve eksilerini anlamak için app.config, her ikisinin teknik ayrıntılarına bakmanızı öneririm. Aşağıda, daha fazla teknik ayrıntıyı açıklamak için kaynak kodunu bulabileceğiniz bağlantılar ekledim.

Onlarla çalıştığımda tanıdıklarımı kısaca özetleyeyim ( not: aynı şey web.configbir web sitesi / web uygulaması dosyası için de geçerlidir ):


.NET'teki applicationSettings
(kaynak kodunu ve teknik ayrıntıları görüntülemek için yukarıya tıklayın)


Artıları

  • Nesne türleri de dahil olmak üzere yazılan verilerin depolanmasına izin verir ( serializeAsözellik aracılığıyla )

  • Varsayılan değerlerin depolanmasına izin veren bir kullanıcı ve uygulama kapsamı vardır

  • Visual Studio'nun yapılandırma bölümünde desteklenirler

  • Uzun karakter dizileri ve / veya özel karakterli veriler çok iyi desteklenir (örneğin, çift tırnak içeren gömülü JSON karakter dizileri)


Eksileri

  • Kullanıcı ayarları kullanıcı profilinde farklı bir yerde saklanır (şifreli bir yolla), temizlenmesi zor olabilir

  • Uygulama kapsamı ayarları, uygulamanın çalışma zamanı sırasında salt okunurdur (çalışma zamanı sırasında yalnızca kullanıcı kapsamı ayarları değiştirilebilir)

  • Doğrudan 3. taraf araçlar tarafından sağlanmayan Visual Studio'nun ayarlar tasarımcısı tarafından oluşturulan Okuma / Yazma yöntemleri kodu (geçici çözüm için yukarıdaki bağlantıya bakın)


.NET
Update'teki AppSettings: .NET Core'daki AppSettings
(kaynak kodu ve teknik ayrıntıları görüntülemek için yukarıya tıklayın)


Artıları

  • "Hafif", yani kullanımı kolaydır

  • Uygulamanın çalışma süresi boyunca okuma ve yazma erişimi


  • Internet Information Services (IIS) Yöneticisi'ndeki Yöneticiler tarafından kolayca düzenlenebilirler
    (Özellikler Görünümü -> Uygulama Ayarları, simgenin adının yanıltıcı olduğuna dikkat edin, çünkü ApplicationSettings'i değil AppSettings'i işleyebilir)


Eksileri

  • Sadece dize verilerini destekleyin; dize uzunluğu ve özel karakterler sınırlıdır

  • Kullanıcı kapsamı yok

  • Varsayılan değerleri desteklemiyorlar

  • Visual Studio'nun yapılandırma bölümünde doğrudan desteklenmez



9

Tek değerleri saklamak ve bunlara erişmek için daha basit bir sürümle çalışmayı seviyorum.

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

Varsayılan değerlere izin veren yazım güvenli bir şekilde değerlere erişmek için bir yardımcı sınıf yazdım. Varsayılanlar sağlanmazsa, yararlı özel durum mesajları verilir.

Sınıfı burada görebilir / indirebilirsiniz:

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


3
+1, özellikle birden fazla montajınız varsa daha basittir (ayarların montaj başına bir bölümü vardır). Benzer bir yardımcı sınıfım var. BTW sınıfınız şu anda yapılandırma dosyasının kültüre duyarlı dizeleri kullanmasını bekliyor. s, sonuç)). Nitpick'e de MS kodlama yönergeleri GetInt, GetShort, GetBool yerine GetInt32, GetInt16, GetBoolean'ı önerir.
Joe

Bu iyi, ama AppSettings profesyonelleri ve eksileri hakkındaki soruya cevap vermiyor.
Matt

@Matt, profesyonel daha basit olmasıdır. Con daha basit olmasıdır. Yalnızca birkaç değişmez değere (bools, ints, string, vb.) İhtiyacınız varsa, bu yaklaşım paranın karşılığını en çok verir. Yapısal verilere, ad alanı ayırmaya, XSD destekli doğrulama / tamamlamaya vb. İhtiyacınız varsa, özel bir bölüm daha uygun olabilir. Başka bir seçenek App.configdosyayı tamamen yok saymak ve kendi yapılandırma dosyanızı kullanmaktır. Pek çok kütüphane bunu yapıyor. NLog akla geliyor.
Drew Noakes

@DrewNoakes - Sana katılıyorum. Açıklama için teşekkürler.
Matt
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.