Bueno, miren que lejos hemos llegado con el asunto de las configuraciones
pero no se preocupen, aún falta mucho más que aprender sobre nuestros amigos los archivos app/web.config y sobre nuestras configuraciones personalizadas, imagínense un mundo con menos
Element Validators
Imagínense que en su sistema de configuración necesitan validar que el número ingresado por el usuario en la configuración se encuentre dentro de un rango, o que el texto ingresado cumpla con una expresión regular o cumpla una longitud mínima o máxima (si, ya se, ambos se pueden lograr con un regex, pero para efectos de ejemplo digamos que son dos diferentes). Muchos quizás nos veremos tentados a obtener el valor de la configuración y posteriormente validarlo, bien, en el caso de elementos de configuración es buena idea abstenerse de hacerlo. La buena noticia es que tenemos a nuestra disposición toda una infraestructura de validación de valores de configuración y esta se lleva a cabo en el momento en que el ConfigurationManager lee los valores.
Los Validators son atributos especiales que acompañan a nuestros elementos de configuración, podemos definir nuestros propios validadores (ese será el tema de un post futuro) pero por defecto la framework nos empaca un par de validadores simples y sencillos:
| IntegerValidator | Valida un entero dentro de un rango |
| LongValidator | Valida un número dentro de un rango |
| PositiveTimeSpanValidator | Valida un timespan dentro de un rango positivo |
| RegexStringValidator | Valida que una cadena cumple con una expresión regular |
| StringValidator | Valida que una cadena debe cumplir una longitud máxima/mínima |
| TimeSpanValidator | Valida un timespan dentro de un rango |
Usar los validadores no puede ser más sencillo, simplemente adornamos nuestras propiedades o elementos con el atributo del validador que nos interesa y la framework de configuración se encarga del resto
using System;
using System.Configuration;
namespace Samples {
public class SampleConfigurationSection : ConfigurationSection {
[ConfigurationProperty("port", DefaultValue = 80)]
[IntegerValidator(MaxValue = 100, MinValue = 20)]
public int Port {
get { return (int) this["port"]; }
}
[ConfigurationProperty("host", IsRequired = true)]
public string Host {
get { return (string) this["host"]; }
}
[ConfigurationProperty("timeout")]
[TimeSpanValidator(MinValueString = "00:00:00",
MaxValueString = "00:01:00")]
public TimeSpan Timeout {
get { return (TimeSpan) this["timeout"]; }
}
}
}
Para probar la configuración podemos usar este simple
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="sample" type="Samples.SampleConfigurationSection, ValidatorSample"/>
</configSections>
<sample host="localhost" port="80" timeout="00:00:30" />
</configuration>
Y este pequeño programa de consola puede servirnos como simple prueba
using System;
using System.Configuration;
namespace Samples {
internal class Program {
private static void Main(string[] args) {
var cfg = ConfigurationManager.GetSection("sample")
as SampleConfigurationSection;
if (cfg == null)
return;
Console.WriteLine("Host: {0}, Port: {1}, Timeout: {2}",
cfg.Host, cfg.Port, cfg.Timeout);
Console.ReadLine();
}
}
}
Si algún elemento no cumple con lo esperado por el validador el ConfigurationManager tirará una excepción de tipo ConfigurationErrorsException que a su vez en la propiedad Errors contendrá los ConfigurationException en forma de arreglo.
