domingo, 4 de diciembre de 2016

Personalizar esqema de configuración en .Net (I)


Todo el mundo que ha trabajado con una aplicación .Net conoce el archivo Web.config o sus homólogos para aplicaciones de escritorio App.config (qué visual studio traduco con el nombre ejecutable.config) Y es muy habitual utilizar la clase AppSettings para definir los parámetros de configuración de la forma.
<appSettings>
    <add key="Setting1" value="May 5, 2017"/>
    <add key="Setting2" value="May 6, 2017"/>
</appSettings>

Pero en ocasiones necesitamos estructuras de datos más complejas o simplemente darle un aspecto más profesional. Y para ello existe la clase ConfigurationSection con la cual podemos definir una sección entera del archivo web.config.

Primero definimos nuestra clase de configuración. Utilizando un patrón Singleton para ofrecer una instancia única.

public sealed class MyConfigurationSection : ConfigurationSection
{
    #region Singleton
    private MyConfigurationSection()
    {
    }

    private static MyConfigurationSection _CurrentConfiguration;

    public static new MyConfigurationSection CurrentConfiguration
    {
        get
        {
            if (_CurrentConfiguration == null)
            {
                _CurrentConfiguration = (MyConfigurationSection)ConfigurationManager.GetSection(@"myConfig");
            }

            return _CurrentConfiguration;
        }
    }
    #endregion
}

Y posteriormente definimos los parámetros de configuración que formaran parte de nuestra sección.


[ConfigurationProperty("serverUrl", IsRequired = false)]
public string ServerUrl
{
    get { return (string)this["serverUrl"];
    set { this["serverUrl"] = value; }
}

Pudiendo definir si el campo es obligatorio o no, definiendo un valor por defecto.


[ConfigurationProperty("MaxUsers", IsRequired = false, DefaultValue =25)]

public long MaxUsers

{

    get { return (long)this["maxUsers"]; }

    set { this["maxUsers"] = value; }

}

Definir un valor máximo.


[LongValidator(MinValue = 1, MaxValue = 1000000, ExcludeRange = false)]


[ConfigurationProperty("MaxUsers", IsRequired = false, DefaultValue =25)]


public long MaxUsers


{


    get { return (long)this["maxUsers"]; }


    set { this["maxUsers"] = value; }

}

O especificar un tamaño de la cadena o una lista de caracteres invadidos.

[StringValidator(InvalidCharacters = " ~!@#$%^&*()[]{}/;'\"|\\", MinLength = 1, MaxLength = 60)]

[ConfigurationProperty("FileName", IsRequired = true)]

public string FileName

{

    get { return (string)this["fileName"]; }

    set { this["fileName"] = value; }
}


Una vez tenemos nuestra clase para leer el fichero de configuración, deberemos introducir la configuración en nuestro fichero web.config o app.config, según proceda. De la siguiente forma.

Primero definimos la referencia a nuestra sección

<?xml version="1.0"?>
<configuration>
  <configSections>
   <section name="myConfiguration" type="namespace.MyServerConfiguration, Assembly" />
  </configSections>
….
</configuration>

Y ya podemos definir nuestra sección.

<myConfiguration serverUrl="http:// …." MaxUsers="48">



No hay comentarios: