64 votes

Comment stocker un objet dictionnaire dans mon fichier web.config?

J'aimerais stocker un dictionnaire de chaîne clé / valeur simple dans mon fichier de configuration Web. Visual Studio facilite le stockage d'une collection de chaînes (voir l'exemple ci-dessous), mais je ne sais pas comment procéder avec une collection de dictionnaires.

         <ArrayOfString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
          <string>value1</string>
          <string>value2</string>
          <string>value2</string>
        </ArrayOfString>
 

121voto

Juliet Points 40758

Pourquoi réinventer la roue? La section AppSettings est conçue dans le seul but de stocker des données de type dictionnaire dans votre fichier de configuration.

Si vous ne souhaitez pas mettre trop de données dans votre section AppSettings, vous pouvez regrouper les valeurs associées dans leur propre section comme suit:

 <configuration>
  <configSections>
    <section 
      name="MyDictionary" 
      type="System.Configuration.NameValueFileSectionHandler,System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
  </configSections>

  <MyDictionary>
     <add key="name1" value="value1" />
     <add key="name2" value="value2" />
     <add key="name3" value="value3" />
     <add key="name4" value="value4" />
  </MyDictionary>
</configuration>
 

Vous pouvez accéder aux éléments de cette collection en utilisant

 using System.Collections.Specialized;
using System.Configuration;

public string GetName1()
{
    NameValueCollection section =
        (NameValueCollection)ConfigurationManager.GetSection("MyDictionary");
    return section["name1"];
}
 

27voto

Factor Mystic Points 12465

La réponse de Juliette est précise, mais pour votre information, vous pouvez également ajouter d'autres configurations dans des fichiers externes .config , en configurant votre web.config comme suit:

 <?xml version="1.0"?>
<configuration>
  <configSections>
    <!-- blah blah the default stuff here -->

    <!-- here, add your custom section -->
    <section name="DocTabMap" type="System.Configuration.NameValueFileSectionHandler, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
  </configSections>

  <!-- your custom section, but referenced in another file -->
  <DocTabMap file="CustomDocTabs.config" />

  <!-- etc, remainder of default web.config is here -->
</configuration>
 

Ensuite, votre CustomDocTabs.config ressemble à ceci:

 <?xml version="1.0"?>
<DocTabMap>
  <add key="A" value="1" />
  <add key="B" value="2" />
  <add key="C" value="3" />
  <add key="D" value="4" />
</DocTabMap>
 

Vous pouvez maintenant y accéder en code via:

 NameValueCollection DocTabMap = ConfigurationManager.GetSection("DocTabMap") as NameValueCollection;
DocTabMap["A"] // == "B"
 

5voto

Maxime Rouiller Points 5987

Vous devrez implémenter une section personnalisée (voir Concepteur de section de configuration ).

Ce que vous voulez vraiment ... est quelque chose de proche:

 <MyDictionary>
  <add name="Something1" value="something else"/>
  <add name="Something2" value="something else"/>
  <add name="Something3" value="something else"/>
</MyDictionary>
 

Où le "nom" XmlAttribute est une clé qui ne permet pas d'en avoir plus d'une dans le code. Dans le même temps, assurez-vous que Collection MyDictionary est également un dictionnaire.

Vous pouvez faire tout cela avec cet outil et combler les lacunes si nécessaire.

3voto

christo Points 331

Dans les paramètres de l'application, nous pouvons utiliser System.Collection.Specilized.StringCollection

 <X.Properties.Settings>
  <setting name="ElementsList" serializeAs="Xml">
    <value>
      <ArrayOfString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:xsd="http://www.w3.org/2001/XMLSchema">
        <string>Element1</string>
        <string>Element2</string>
      </ArrayOfString>
    </value>
  </setting>
</X.Properties.Settings>
 

Accès à la liste:

 var element = Settings.Default.ElementsList[index]
 

0voto

JaredPar Points 333733

Je ne suis pas sûr de savoir comment stocker un dictionnaire directement, mais vous pouvez facilement utiliser un tableau de chaînes pour stocker un dictionnaire. Pour chaque clé, paire de valeurs, vous enregistrez la clé en tant que première chaîne et la valeur en tant que seconde. Ensuite, lors de la reconstruction du dictionnaire, vous pouvez annuler cet encodage.

 static Dictionary<string,string> ArrayToDictionary(string[] data) {
  var map = new Dictionary<string,string>();
  for ( var i=  0; i < data.Length; i+=2 ) {
    map.Add(data[i], data[i+1]);
  }
  return map;
}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X