Durante el desarrollo del GAttach, encontré la necesidad de salvar la información de los settings de la aplicación. Lo primero que se me ocurrió fué lo siguiente:
- Crear una clase (ConfigurationManager) con las propiedades que serán guardadas dentro del archivo (por ejemplo: string:DefaultFolder, bool:DeleteFiles, etc.)
- Para no meterme en rollos de XPath y streaming, decidí utilizar un DataSet en el cual le pongo como columnas el nombre de la propiedad y esta propiedad es mapeada internamente por la clase.
- Utilizamos el evento DataSet.ReadXML y DataSet.WriteXML para persistir la información a un archivo de texto local.
Es muy práctico este acercamiento a esta solucion porque:
- Haces leverage del DataSet para manejo de columnas.
- Para la persistencia solo hace falta un evento WriteXML y para la lectura un ReadXML
- Haces uso de la colecciones Columns para encontrar las llaves de tu configuración
Aquí voy a poner un segmentito de código que muestra como funciona mi solución:
| 1 | using System; | 
| 2 | using System.Data; | 
| 3 | using System.IO; | 
| 4 | using System.Collections; | 
| 5 | using System.Diagnostics; | 
| 6 | |
| 7 | namespace Intellekt.GAttach2003.Utils | 
| 8 | { | 
| 9 | public class ConfigurationManager | 
| 10 | protected const string DEFAULTTBL = “_default”; | 
| 11 | |
| 12 | private string _configFile = string.Empty; | 
| 13 | private string _defaultFolder = string.Empty; | 
| 14 | protected DataSet _configSet = new DataSet(“Configuration”); | 
| 15 | |
| 16 | public ConfigurationManager(string configFile) | 
| 17 | { | 
| 18 | _configFile = configFile; | 
| 19 | if (File.Exists(configFile)) | 
| 20 | { | 
| 21 | // Read the configuration file from the archive | 
| 22 | _configSet.ReadXml(configFile); | 
| 23 | } | 
| 24 | else | 
| 25 | { | 
| 26 | // File does not exists, assume defaults | 
| 27 | CreateConfigRows(); | 
| 28 | } | 
| 29 | } | 
| 30 | |
| 31 | public string DefaultFolder | 
| 32 | { | 
| 33 | get | 
| 34 | { | 
| 35 | return _defaultFolder; | 
| 36 | } | 
| 37 | set | 
| 38 | { | 
| 39 | _defaultFolder = value; | 
| 40 | } | 
| 41 | } | 
| 42 | |
| 43 | public bool SaveConfiguration() | 
| 44 | { | 
| 45 | bool _result = true; | 
| 46 | try | 
| 47 | { | 
| 48 | DataRow dr = _configSet.Tables[DEFAULTTBL].NewRow(); | 
| 49 | |
| 50 | dr[“defaultFolder”] = this._defaultFolder; | 
| 51 | |
| 52 | _configSet.Tables[DEFAULTTBL].Rows.Add(dr); | 
| 53 | _configSet.WriteXml(_configFile); | 
| 54 | } | 
| 55 | catch(Exception ex) | 
| 56 | { | 
| 57 | Debug.WriteLine(ex.Message); | 
| 58 | _result = false; | 
| 59 | } | 
| 60 | return _result; | 
| 61 | } | 
| 62 | |
| 63 | private void CreateConfigRows() | 
| 64 | { | 
| 65 | DataTable dt = new DataTable(DEFAULTTBL); | 
| 66 | |
| 67 | dt.Columns.Add(new DataColumn(“defaultFolder”)); | 
| 68 | |
| 69 | _configSet.Tables.Add(dt); | 
| 70 | } | 
| 71 | } | 
| 72 | } | 
Ya cuando había terminado, me pareció una buena opción hacer uso de un DataSet para persistir la información. Me quedé pensando como la comindad estaba haciendo esto, así que me metí a CodeProject y encontré un ConfigurationManager que escribe a INI, XML y Registry. Este productito hace exactamente lo que necesitaba y de una manera más “nativa”… así que decidí; después de haber tirado todo el código para configuración cambiar a este.
Otra cosa es que no quise utilizar el Configuration Manager Application Block de Microsoft, por que es overkill para lo que estoy intentando [3 o 4 settings de configuración no valen la pena para utilizar algo tan sofisticado :)]
Moraleja: Haz un search en el CodeProject o en Google antes de reinventar el hilo negro…
Cheers!
