2010-11-18 3 views
7

Ich lerne über die Verwendung von Config-Dateien und ich stieß auf einige Probleme, die ich hoffe, jemand hier kann mir einen Rat geben. Es spielt keine Rolle, ob meine Dateien XML sind oder nicht, aber die meisten Beispiele, die ich gelesen habe, benutzen sie und ich bin für alles, was mein Leben einfacher macht.Verwenden mehrerer Werte für einen Schlüssel in appSettings

das Problem in Im Laufen ist, dass die appSettings Datei Setup scheint zu sein, nur für einen Schlüssel einen Wert zu annehmen, und ich möchte etwas Ähnliches haben:

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

Ive eine hack here gefunden, aber es war vor über 6 Jahren geschrieben und ich wusste nicht, ob es einen besseren Weg gab.

Auch hier spielt es keine Rolle, ob diese XML ist eine flache Datei, etc .... Ich versuche nur zu lernen, wie Konfigurationsdateien zu verwenden, anstatt harte Codierung Werte direkt in die App.

Danke für Ihre Hilfe.

+1

aber das macht wenig Sinn. Warum brauchst du das? –

+2

Wie macht es "wenig Sinn"? Manchmal benötigen Sie eine Liste von Werten. –

+0

@MitchWheat Ein Beispiel wäre eine Liste von E-Mail-Adressen. Es ist einfacher, eine Zeile pro Adresse zu haben, anstatt sie mit ';' oder ',' zu trennen, die Werte auszuwerten usw. Es ist auch einfacher, einen einzelnen Eintrag auszukommentieren, als ihn in der Konfiguration zu finden und vollständig zu löschen. – Yuck

Antwort

10

wenn Sie wirklich mehrere Maschinen unter dem Schlüssel speichern müssen, wäre es sinnvoller sein, zu tun:

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

mit der Begrenzer ein Zeichen Ihrer Wahl zu sein.

10

Eine Alternative zum Eintrag Attribute wäre geordneten Knoten Ihrer Einstellung Knoten hinzuzufügen:

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

Auf diese Weise brauchen Sie nicht String-Manipulationen, die verschiedenen Werte zu extrahieren.

+0

Das ist eine interessante Lösung, aber mit der integrierten AppSettings-Funktion würde diese XML nicht aufgenommen werden, oder? –

+0

@ Jeremy B .: tatsächlich. Die AppSettings-XML sollte Schlüsselwerte enthalten, deren Werte Strings sind. MS hat jedoch die appSettings veraltet und empfiehlt stattdessen, den ConfigurationManager zu verwenden. http://msdn.microsoft.com/en-us/library/system.configuration.configurationmanager.aspx. – xtofl

+0

Danke für die Info, ich werde mich daran erinnern, dass ich das nächste Mal, wenn ich so etwas brauche, besser finde als die String-Manipulation. –

1

Sie können Konfigurationsabschnitte verwenden, in denen Sie Ihre eigene Konfiguration definieren können. Nur

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

nach dem <configuration> und Sie können Ihre benutzerdefinierten Abschnitt unmittelbar nach dem Appsetting

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

hinzufügen Zum Lesen Sie einige Klassen

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

Die überschriebene DeserializedElement erstellen benötigen deserialisieren das Xml (innerhalb) des QueryElement1 & 2.

Um die Werte aus der Hauptanwendung zu lesen, müssen Sie nur die folgenden nennen:

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

Vielleicht sollten Sie Ihr Design überdenken. Ich würde einfach die gewünschte Liste in eine andere Datei und nicht in die Config legen. Sie könnten eine Zeichenfolge mit Trennzeichen erstellen, aber wenn die Liste dann lang wird, ist es schwierig, sie zu verwalten. Sie könnten es einfach in eine Textdatei oder eine XML/JSON-Datei einfügen. Hier ist ein Code, der ein guter Anfang sein könnte.

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

Ich habe es eine statische Klasse, so wäre es aus der Datei einmal nur lesen und nicht jedes Mal wenn Sie brauchen von ihm Informationen zu erhalten.

Dies kann auch eine gute Sache sein, um eine Datenbank zu erstellen, wenn Sie mehr Funktionalität benötigen. Aber für eine kleine schreibgeschützte Art funktioniert das besser als eine begrenzte Zeichenfolge für längere Werte.