2009-01-20 16 views
7

¿Hay alguien por ahí que tenga un ejemplo de uso de un archivo de configuración incrustado en VB.NET o C#? Entiendo cómo incrustar el archivo de configuración, pero ¿cuál es el mejor método para acceder a él luego? ¿Puedo tratarlo como un archivo de configuración, como puedo con los archivos de configuración externos?Archivo de configuración como recurso incrustado

Cualquier ayuda es muy apreciada.

Respuesta

7

Creo que no es la idea de poner el archivo de configuración para ser un recurso incrustado. los recursos incrustados se empaquetan en el dll y luego no se puede cambiar la configuración sin la recompilación (que es la idea de un archivo de configuración en primer lugar).

+14

Algunas configuraciones son solo para fines de desarrollo, no de configuración de implementación. Esta funcionalidad aún es necesaria. – rjarmstrong

+2

bien, hay varias maneras de hacerlo entonces. Mi opinión es que las constantes codificadas en una clase de configuración (estática) son mucho más rápidas en ese caso, en comparación con obtener valores del archivo de configuración. Debido a que los recursos integrados necesitan una recompilación para cambiar los valores, no es una pérdida tener una clase que deba recompilarse después de cambiar algunos valores en ella. Otra técnica para hacer esto es proporcionar valores predeterminados para los valores que no se encuentran en el archivo de configuración: no es necesario especificar los valores para la implementación y se pueden anular en el entorno de desarrollo utilizando un archivo de recursos no incorporado ... – zappan

+0

¿Cómo puedo tener un solo exe que se ejecutará en todos los frameworks .net? ¿Hay alguna forma de incrustar las cadenas app.config dentro del propio exe? –

4

Una opción para usted es usar un objeto de configuración para contener valores predeterminados para cualquier configuración. Entonces, en el constructor del objeto de configuración, podría intentar anular los valores de configuración predeterminados con valores de alguna parte, como app.config, una tabla de configuración de base de datos, etc.

Esto es útil para varios propósitos:

  1. Las herramientas de prueba de unidades (como nUnit) requieren una configuración especial para acceder a app.config.
  2. La existencia del archivo app.config no es necesaria ya que usará los valores predeterminados (que parece ser su objetivo).
  3. Puede ayudar a garantizar valores de configuración de seguridad de tipo.

Un ejemplo sencillo:

public class MyConfiguration 
{ 


    private string _defaultValue1 = "Value1"; 
    private int _defaultValue2 = 22; 



    public string Value1 
    { 
     get 
     { 
      return _defaultValue1; 
     } 
    } 

    public int Value2 
    { 
     get 
     { 
      return _defaultValue2; 
     } 
    } 

    #region cnstr 

    public MyConfiguration() 
    { 
     LoadValuesFromConfigurationXml(); 
    } 

    #endregion 


    public static MyConfiguration GetConfig() 
    { 
     // Optionally Cache the config values in here... caching code removed 
     // for simplicity 
     return new MyConfiguration(); 
    }  

    internal void LoadValuesFromConfigurationXml() 
    { 
     int tempInt; 

     string value = ConfigurationManager.AppSettings["Value1"]; 

     if (!String.IsNullOrEmpty(value)) 
     { 
      _defaultValue1 = value; 
     } 

     value = ConfigurationManager.AppSettings["Value2"]; 

     if (!String.IsNullOrEmpty(value)) 
     { 
      if (int.TryParse(value, out tempInt)) 
      { 
       _defaultValue2 = tempInt; 
      } 
     } 


    } 

} 

Para acceder a los valores de configuración utilizan los:. MyConfiguration.GetConfig() Valor1

Espero que esto ayude, Max

+1

¿Por qué la votación negativa sin comentarios? Si hay algo mal con el código anterior, me gustaría saber por qué, pero un voto negativo al azar no es muy útil ... –

+0

upvoted porque creo que es una manera elegante de combinar los enfoques anteriores de tener un archivo de configuración predeterminado de cualquiera que sea el tipo y una clase interna para manejar valores predeterminados, así como cargar y guardar archivos de configuración ... pero lo implementaría como una clase interna estática ya que no puedo pensar en ninguna buena razón para tener dos configuraciones separadas activas en el Mismo tiempo. – Gooo

3

por lo general tienen una clase que guarda las preferencias en un xml en el UserAppDataPath. Algo como:

public class Preferences 
    { 
     public static String prefFile = "/preferences.xml"; 
     private static XmlDocument doc; 

     public static void set(String prefName, String value) 
     { 
      XmlElement nnode = (XmlElement)root.SelectSingleNode("//" + prefName); 
      if (nnode == null) 
      { 
       nnode = doc.CreateElement(prefName); 
       root.AppendChild(nnode); 
      } 
      nnode.InnerText = value; 
     } 
     public static String get(String prefName) 
     { 
      XmlElement nnode = (XmlElement)root.SelectSingleNode("//" + prefName); 
      if (nnode != null) return nnode.InnerText; 
      return ""; 
     } 

     private static XmlElement root 
     { 
      get 
      { 
       if (doc == null) 
       { 
        doc = new XmlDocument(); 
        try 
        { 
         doc.Load(Application.UserAppDataPath + prefFile); 
        } 
        catch (Exception) 
        { 
         doc.LoadXml("<root></root>"); 
         NodeChangedHandler(null, null); // costringo a salvare. 
        } 
        doc.NodeChanged += new XmlNodeChangedEventHandler(NodeChangedHandler); 
        doc.NodeInserted += new XmlNodeChangedEventHandler(NodeChangedHandler); 
        doc.NodeRemoved += new XmlNodeChangedEventHandler(NodeChangedHandler); 
       } 
       return (XmlElement)doc.FirstChild; 
      } 
     } 
     private static void NodeChangedHandler(Object src, XmlNodeChangedEventArgs args) 
     { 
      if (doc != null) 
       doc.Save(prefFile); 
     } 
    } 
Cuestiones relacionadas