Crear secciones personalizadas en el archivo de configuración

Generalmente hacemos el buen uso de utilizar el archivo de configuración para almacenar algunos valores que son necesarios para el funcionamiento de las aplicaciones, pero que pueden cambiar con el paso del tiempo: Cadenas de conexión a base de datos, end points para conectar con servicios web, direcciones de servidores, etcétera.

Si bien es cierto que existen secciones como ConnectionStrings o AppSettings, llegamos a veces a un punto que esto deja de ser elegante hasta el punto de no saber a qué corresponden ciertas claves. Por ello, os propongo la creación de secciones personalizadas donde podamos almacenar de una forma más organizada todo aquello que añadíamos directamente en AppSettings y que pueda tener alguna relación.

En primer lugar vamos a crear una clase que será la que se corresponda con los datos que almacenaremos en nuestra sección personalizada. La misma heredará de la clase ConfigurationSection:

using System.Configuration;
namespace CustomConfigurationSection
{
    public class SmtpSettings : ConfigurationSection
    {
        [ConfigurationProperty("Url", DefaultValue = "smtp.returngis.com", IsRequired = true)]
        public string Url
        {
            get
            {
                return (string)this["Url"];
            }
            set
            {
                this["Url"] = value;
            }
        }
        [ConfigurationProperty("Port", DefaultValue = 80)]
        public int Port
        {
            get
            {
                return (int)this["Port"];
            }
            set
            {
                this["Port"] = value;
            }
        }
    }
}

Como podemos ver, cada propiedad está decorada con el atributo ConfigurationProperty en el cual determinaremos el nombre de la propiedad con la que se corresponde en el archivo de configuración, el valor por defecto, si es requerida la propiedad, etcétera.
Por otro lado, debemos modificar el apartado configSections del archivo de configuración para declarar la nueva sección de la siguiente manera:

<configSections>
 <section name="SmtpSettings" type="CustomConfigurationSection.SmtpSettings, CustomConfigurationSection"/>
</configSections>

Por último añadimos dentro del apartado <configuration> una nueva sección de tipo SmtpSettings donde especificamos los valores necesarios.

<SmtpSettings Url="smtp.test.com" Port="25"/>

Si quisiéramos acceder a estos valores a través de la aplicación podríamos utilizar el objeto SmtpSettings para recuperarlos de la siguiente manera:

using System;
using System.Configuration;
namespace CustomConfigurationSection
{
    class Program
    {
        static void Main()
        {
            var smtpSettings = (SmtpSettings)ConfigurationManager.GetSection("SmtpSettings");
            Console.WriteLine("SMTP:{0} PORT: {1}", smtpSettings.Url, smtpSettings.Port);
            Console.ReadKey();
        }
    }
}

De esta forma, conseguimos obtener los valores desde el archivo de configuración de una forma más estructurada y en tan solo una línea 🙂

Espero que sea de utilidad.

¡Saludos!