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!
Deja una respuesta
Lo siento, debes estar conectado para publicar un comentario.