2010-11-18 20 views
7

Yapılandırma dosyalarını nasıl kullanacağımı öğreniyorum ve bazılarının bana tavsiyede bulunabileceğini umduğum bazı sorunlar yaşadım. Dosyamın XML olup olmadığı önemli değil ama okuduğum örneklerin çoğu onları kullanıyor ve ben de hayatımı kolaylaştıran her şey için.AppSettings'de bir anahtar için birden çok değer kullanma

<key="Machine List" value="Server105" /> 
<key="Machine List" value="Server230" /> 

Ive bir hack here bulundu ama öyleydi: Im içine çalışan bir sorun

tek anahtar için bir değeri kabul ve ben benzer bir şey istiyorum için appSettings dosya kurulum gibi görünüyor olmasıdır 6 yıl önce yazılmış ve daha iyi bir yolu olup olmadığını bilmiyordum.

Yine, bu XML, düz dosya, vs .... ise olsun eğer doesnt Im sadece doğrudan uygulamanın içine yapılandırma dosyaları yerine sabit kodlama değerleri nasıl kullanılacağını öğrenmeye çalışıyorum.

Yardımlarınız için teşekkürler. Eğer gerçekten anahtarının altında birden fazla makine saklamak gerekiyorsa

+1

ama bu biraz anlam ifade etmiyor. neden buna ihtiyacın var? –

+2

"Biraz anlam" nasıl? Bazen bir değerler listesine ihtiyacın var. –

+0

@MitchWheat Bir örnek, e-posta adreslerinin bir listesi olacaktır. Bunları sınırlamak yerine adres başına bir satırın olması daha kolay; ',' veya ',', değerleri ayrıştırmak vb. Tek bir girişi, yapılandırmada bulup tamamen silmekten daha kolaydır. – Yuck

cevap

10

, bunu yapmak daha uygun olur: sınırlayıcı sizin seçtiğiniz bir karakteri olmak

<key="Machine List" value="Server105,Server230" /> 

.

10

giriş özelliklerine alternatif başka bir ayar düğüme alt düğümleri eklemek olacaktır:

<setting key="Machine List"> 
    <value>Server105</value> 
    <value>Server230</value> 
    </setting> 

farklı değerleri ayıklamak için dize manipülasyonlar gerekmez Bu şekilde.

+0

Bu ilginç bir çözümdür, ancak yerleşik appSettings işlevini kullanarak, bu xml alınmaz mı? –

+0

@Jeremy B .: gerçekten. AppSettings xml, değerlerin dizge olduğu anahtar değerleri içermelidir. Ancak, MS, AppSettings'i kapatmış ve bunun yerine ConfigurationManager'ı kullanmasını önerir. http://msdn.microsoft.com/en-us/library/system.configuration.configurationmanager.aspx. – xtofl

+0

Bilgi için teşekkürler, bir dahaki sefere böyle bir şeye ihtiyacım olduğunu hatırlayacağım, bunun yanı sıra dize manipülasyonundan da daha iyisini seviyorum. –

1

Kendi yapılandırmanızı tanımlayabileceğiniz yapılandırma bölümlerini kullanabilirsiniz. Sadece <configuration> sonra

<configSections> 
    <sectionGroup name="MyConfiguration"> 
    <section name="MyQuery" type="namespace.QueryConfigurationSection" allowLocation="true" allowDefinition="Everywhere"/> 
    </sectionGroup> 
</configSections> 

eklemek ve sadece appSetting'in sonra özel bir bölüm ekleyebilirsiniz

</appSettings> 
<!-- custom query configuration --> 
<MyConfiguration> 
<MyQuery>  
    <Query1> </Query1> 
    <Query2> </Query2> 

Eğer birkaç derse

/// <summary> 
/// Creates a custom configuration section inside web.config 
/// </summary> 
public class QueryConfigurationSection : ConfigurationSection 
{ 
    //query 2 
    [ConfigurationProperty("Query1")] 
    public QueryElement1 Query1 
    { 
     get { return this["Query1"] as QueryElement1; } 
    } 

    //query 2 
    [ConfigurationProperty("Query2")] 
    public QueryElement2 Query2 
    { 
     get { return this["Query2"] as QueryElement2; } 
    } 
} 


public class QueryElement1 : ConfigurationElement 
{ 
    public string Value { get; private set; } 
    protected override void DeserializeElement(XmlReader reader, bool s) 
    { 
     Value = reader.ReadElementContentAs(typeof(string), null) as string; 
    }   
} 


public class QueryElement2 : ConfigurationElement 
{ 
    public string Value { get; private set; } 
    protected override void DeserializeElement(XmlReader reader, bool s) 
    { 
     Value = reader.ReadElementContentAs(typeof(string), null) as string; 
    } 
} 

geçersiz kılınan DeserializedElement serisini olacak oluşturmanız gerekir okumak için Xml (iç) QueryElement1 & 2.

ana uygulamadan değerleri okumak için, yalnızca takip çağırmanız gerekir:

//calling my query config 
QueryConfigurationSection wconfig = (QueryConfigurationSection)ConfigurationManager.GetSection("MyConfiguration/MyQuery"); 
string _query1 = wconfig.Query1.Value; 
string _query2 = wconfig.Query2.Value; 
1

Belki de tasarımını yeniden düşünmek gerekir. İstediğiniz listeyi başka bir dosyaya değil, config dosyasına koyardım. Sınırlandırılmış bir dizge yapabilirdiniz, ancak eğer liste uzun sürerse, onu yönetmek zor olurdu. Sadece bir metin dosyasına veya bir XML/JSON dosyasına koyabilirsiniz. İşte başlamak için iyi bir yer olabilecek bir kod.

public static class MyClass 
    { 
     private static string _path = ConfigurationManager.AppSettings["FilePath"]; 
     private static List<string> _list; 

     static MyClass() 
     { 
      _list = new List<string>(); 
      foreach (string l in File.ReadAllLines(_path)) 
       _list.Add(l); 
     } 
     public static List<string> GetList() 
     { 
      return _list; 
     } 
    } 

Ben bir statik sınıf yalnızca bir kez değil, her ondan bilgi almak gerekir dosyadan okunan diye yaptı.

Daha fazla işlevselliğe ihtiyacınız varsa, bu da bir veritabanına koymak için iyi bir şey olabilir. Fakat küçük bir salt okunur türden bir şey için, bu daha uzun değerler için ayrılmış bir dizgeden daha iyi çalışır.

İlgili konular