Bueno, luego de un largo tiempo de ausencia creo que es hora de continuar con la serie acerca de configuraciones en la .NET Framework. La última vez que conversamos mencionamos la capacidad que tenía una sección de configuración de validar los elementos de configuración, esta capacidad es netamente declarativa a partir de atributos que indican el tipo de validación que debe llevarse a cabo. Como ustedes podrán imaginarse existirán situaciones donde es necesario realizar validaciones afuera de las que ya nos trae la configuration framework.
Existen dos formas de especificar o crear nuestras propias rutinas de validación de la configuración: mediante validation callback y utilizando custom validation attributes. Veremos ambas en esta serie y comenzaremos con la primera: validation callbacks
Validation Callbacks
Imaginemos el siguiente caso hipotético, nuestra sección de validación requiere que se ingrese el nombre o host de la aplicación y el puerto para ese host, la sección en cuestión se vería algo así:
using System.Configuration;
namespace Cprieto.Samples {
public class SampleConfigurationSection : ConfigurationSection {
[ConfigurationProperty("port", DefaultValue = 80)]
public int Port {
get { return (int) this["port"]; }
}
[ConfigurationProperty("host", IsRequired = true)]
public string Host {
get { return (string) this["host"]; }
}
}
}
Bien, ahora imaginemos que por alguna razón especial el puerto no debe ser ni el 110 ni el 23 (o podría ser cualquier otra regla que a uno se le ocurra). Una forma sencilla de realizar esta validación es usando un método callback, la idea es sencilla, cuando la framework obtenga el valor ejecutará el método o callback de validación pasando ese valor (o el por defecto) como parámetro, dentro del método (o callback en este caso) si no se cumple el requerimiento o validación, se arroja una ArgumentException. Los requerimientos del callback method son sencillos: Debe ser público, estático, ser de tipo void (o una Sub en Visual Basic) y tener un parámetro tipo Object (que recibe el valor a validar). Nuestra simple callback de ejemplo sería algo así:
using System;
namespace Cprieto.Samples {
public class PortValidator {
public static void Validate(object value) {
var num = Convert.ToInt32(value);
if (num == 110 || num == 23)
throw new ArgumentException("port must not be 110 or 23");
}
}
}
Ahora simplemente le decimos declarativamente a la sección de configuración que use ese callback basta con adornar el elemento con el atributo CallbackValidatorAttribute
using System.Configuration;
namespace Cprieto.Samples {
public class SampleConfigurationSection : ConfigurationSection {
[CallbackValidator(Type = typeof(PortValidator), CallbackMethodName = "Validate")]
[ConfigurationProperty("port", DefaultValue = 80)]
public int Port {
get { return (int) this["port"]; }
}
[ConfigurationProperty("host", IsRequired = true)]
public string Host {
get { return (string) this["host"]; }
}
}
}
Es importante que recordemos pasar el tipo del validador (o sea, la clase que lo contiene) y el nombre de la función de callback
Para probar nuestro validador basta con usar el siguiente app.config
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="sample"
type="Cprieto.Samples.SampleConfigurationSection, Cprieto.Samples.ValidationCallback"/>
</configSections>
<sample port="110" host="localhost" />
</configuration>
Bien, como dijo Porky… los dejo hasta la siguiente entrega donde continuaremos hablando de validadores en las configuraciones de la .Net Framework, Saludos miles a todos

Pingback: Tweets that mention .NET y Configuraciones – Parte 7 | IDisposable Thoughts -- Topsy.com
Pingback: .NET y Configuraciones – Parte 8 | IDisposable Thoughts
Pingback: .NET y configuraciones – Parte 1 | IDisposable Thoughts