2010-11-18 13 views
7

Estoy aprendiendo a usar archivos de configuración y me encontré con algunos problemas que espero que alguien aquí me pueda dar algunos consejos. No importa si mis archivos son XML o no, pero la mayoría de los ejemplos que he leído los están usando y estoy todo para cualquier cosa que me haga la vida más fácil.Uso de valores múltiples para una clave en la configuración de la aplicación

el problema Im corriendo a decir que el archivo appsettings parece ser configurado para aceptar sólo un valor para una clave y me gustaría tener algo similar a:

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

he encontrado un hack here pero era escrito hace más de 6 años y no sabía si había una mejor manera.

Una vez más, no importa si esto es XML, un archivo plano, etc. Estoy tratando de aprender a usar los archivos de configuración en lugar de los valores de codificación directa directamente en la aplicación.

Gracias por su ayuda.

+1

pero eso tiene poco sentido. ¿Por qué necesitas eso? –

+2

¿Cómo tiene "poco sentido"? A veces necesitas una lista de valores. –

+0

@MitchWheat Un ejemplo sería una lista de direcciones de correo electrónico. Es más fácil tener una línea por dirección en lugar de delimitarlas con ';' o ',', analizar los valores, etc. También es más fácil comentar una sola entrada que ubicarla en la configuración y eliminarla por completo. – Yuck

Respuesta

10

si realmente se necesita para almacenar múltiples máquinas en la clave, que sería más apropiado para hacerlo:

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

con el delimitador de ser un personaje de su elección.

10

Una alternativa a los atributos de entrada sería añadir nodos secundarios a su nodo de configuración:

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

De esta manera no es necesario manipulaciones de cadenas para extraer los diferentes valores.

+0

Esa es una solución interesante, pero al usar la funcionalidad integrada appSettings, este xml no sería recogido, ¿verdad? –

+0

@Jeremy B .: de hecho. AppSettings xml debe contener pares clave-valor donde los valores son cadenas. Sin embargo, MS ha dejado obsoletos los ajustes de la aplicación, y aconseja usar el ConfigurationManager en su lugar. http://msdn.microsoft.com/en-us/library/system.configuration.configurationmanager.aspx. – xtofl

+0

Gracias por la información, recordaré que la próxima vez que necesite algo así, me gusta más que la manipulación de cadenas también. –

1

Puede hacer uso de las secciones de configuración donde puede definir su propia configuración. Sólo tiene que añadir

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

después de la <configuration> y usted puede añadir su sección personalizada justo después de la appSetting

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

Para leer lo que necesita para crear algunas clases

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

El DeserializedElement reemplazado será deserializar el Xml (adentro) el QueryElement1 & 2.

para leer los valores de la aplicación principal, sólo tiene que llamar al siguiente:

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

tal vez debería reconsiderar su diseño. Simplemente pondría la lista que desea en otro archivo y no en la configuración. Podrías hacer una cadena delimitada, pero si la lista fuera larga sería difícil manejarla. Podrías simplemente ponerlo en un archivo de texto o en un archivo XML/JSON. Aquí hay un código que podría ser un buen lugar para comenzar.

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

lo hice una clase estática por lo que sólo sería leer el archivo una vez y no cada vez que se necesita para obtener información de ella.

Esto también puede ser una buena cosa para poner en una base de datos si necesita más funcionalidad. Pero para una pequeña cosa de solo lectura, esto funcionará mejor que una cadena delimitada para valores más largos.

Cuestiones relacionadas