.NET y Configuraciones – Parte 6

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 y con configuraciones más claras y con mayor significado para el desarrollador. Hasta el momento hemos explorado secciones, grupos de secciones, elementos, colecciones todas personalizadas, hoy aprenderemos un poco acerca de validadores.

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 app.config

<?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.

This entry was posted in asp.net, development and tagged , , , , , . Bookmark the permalink.
  • Pingback: Tweets that mention .NET y Configuraciones – Parte 6 | IDisposable Thoughts -- Topsy.com

  • Ricardo

    Que exceso todo lo que se puede hacer con las section! como diria un mi cuate hoy si me siento mas ignorante jajaja, Cristian y desde que framework estan estas opciones? noooo me digas que desde la 1.0 Voy a organizar mis ideas y te hago una consulta porque la consulta era con las collections pero ya resolviste esa duda, Bueno que ahora me surge justo una duda… si ya tengo la cultura de utilizar el application block de validation, lo podría integrar con las section???

  • Ricardo

    Que exceso todo lo que se puede hacer con las section! como diria un mi cuate hoy si me siento mas ignorante jajaja, Cristian y desde que framework estan estas opciones? noooo me digas que desde la 1.0 Voy a organizar mis ideas y te hago una consulta porque la consulta era con las collections pero ya resolviste esa duda, Bueno que ahora me surge justo una duda… si ya tengo la cultura de utilizar el application block de validation, lo podría integrar con las section???

  • Ricardo

    Que exceso todo lo que se puede hacer con las section! como diria un mi cuate hoy si me siento mas ignorante jajaja, Cristian y desde que framework estan estas opciones? noooo me digas que desde la 1.0 Voy a organizar mis ideas y te hago una consulta porque la consulta era con las collections pero ya resolviste esa duda, Bueno que ahora me surge justo una duda… si ya tengo la cultura de utilizar el application block de validation, lo podría integrar con las section???

  • Pingback: .NET y configuraciones – Parte 1 | IDisposable Thoughts