GAttach 2003 – Save to XML Config Settings

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!


Comentarios

Deja una respuesta