René Pacios

/* Overflow My Brain & More */

AppSettings con tipado fuerte y como usar un archivo externo

web config

Desde siembre .NET nos ha ofrecido una forma muy sencilla de gestionar las variables de configuración de nuestra aplicación accediendo a la información de los archivos de configuración app.config o web.config en la sección <appSettings> de los mismos normalmente.

Por qué digo normalmente?, algunas de las secciones de configuración de nuestras aplicaciones podemos extraerlas fuera de los archivos de configuración por defecto de la aplicación, por ejemplo podríamos indicar que la sección de appSettings está en otro archivo evitando tener que acceder al archivo principal de configuración para cualquier cambio en alguna de nuestras propiedades de configuración personalizada.

<appSettings configSource="archivoExterno.config" />

Indicamos el archivo externo en nuestro app.config o web.config y luego tan sólo debemos crear la sección en el archivo indicado.

[sourcecode language='xml'  padlinenumbers='true']
<appSettings>
  <add key="Uno" value="1"/>
  <add key="Dos" value="2"/>
  <add key="Tres" value="3"/>
  <add key="Cuatro" value="4"/>
 <add key="Some:Property" value="Algunas propiedades con caracteres especiales"/>
  <add key="Webpages:Version" value="2.0.0.0" />
  <add key="Webpages Enabled" value="false" />
  <add key="Preserve-LoginUrl" value="true" />
  <add key="ClientValñidationEnabled" value="true" />
  <add key="Unobtrusiv JavaScriptEnabled" value="true" />
</appSettings>
[/sourcecode]

Como veis es una forma muy sencilla de tener la configuración de nuestras aplicaciones un poco más ordenadas. Esto podemos aplicarlo a otras secciones como las de connectionStrings, profile, configuracion del servidor de correo etc.

Para acceder luego a los valores de nuestra configuración lo haremos como siempre, con la clase ConfigurationManager si trabajamos con .NET 2.0 en adelante

ConfigurationManager.AppSettings["Uno"];

Sin embargo si tienes cierta experiencia como programador te darás cuenta que el harcodear la clave de configuración con un cadena de texto es un poco fuente de errores humanos y como que …. bueno, por decirlo de algún modo que nos gusta que haya intellisense, tampoco estaría mal que lo incluyeran en Resharper

Para este pequeño hándicap surgen muchas alternativas, que pueden ir desde declarar una serie de constantes con las claves de configuración, un enumerado, envolver nuestras claves en una clase.

En mi opinión envolver las propiedades de configuración en una clase es una solución bastante elegante, simplemente tendremos que definir una clase que envuelva cada una de las llamadas al ConfigurationManager en una propiedad, algo como lo siguiente:

De este modo gozaremos de intellisense, como podéis ver en la imagen, para acceder a nuestras variables de configuración y lo que es más importante, ahora accedemos mediante tipado fuerte evitando así posibles errores en tiempo de ejecución.

ejemplo intelisense

Sin embargo si sabemos cuales son las propiedades de configuración que tengo en mi fichero .config, y dado que dependiendo del tamaño de la aplicación pueden ser unas cuantas, el picarnos la cases Settings se vuelve un trabajo que tiene aspecto de poderse automatizar, seguro que ya sabéis por donde voy… pues sí, esto con una plantillita T4 podría generar el código por nosotros.

Pues lo cierto, es que hace ya bastante tiempo que me había hecho una de ellas para esta labor que generaba la clase anterior en Module(Clase estática) de VB.NET.  Aprovechando que el otro día me cree al fin una cuenta de GitHub tenía ganas de subir un proyecto y cacharrear un poco con Git, pues he creado una versión reducida de la plantilla T4 que genera mi wrapper sobre las settings de configuración.

Por el momento sólo genera propiedades de sólo lectura para poder acceder de forma tipada a los valores de nuestras configuraciones, pero os prometo que cuando el tiempo me lo permita iré ampliando funcionalidades en la misma. He subido una versión para C# y otra para VB.NET y las podéis descargar desde aquí https://github.com/rene15009/ConfigManager

Las plantillas T4 son pre-procesadas dentro del propio Visual Studio, es el IDE el que ejecuta el código contenido en ellas y produce la salida pertinente, podríamos decir que similar a como funciona .Less o Saassin embargo lo cool de esto es que podemos usar .NET e incluso, actualmente,  depurar el código de nuestras plantillas T4.

Vamos a ver como utilizar estas plantillas en nuestro proyecto, para ello lo primero debemos descargar la plantilla correspondiente al lenguaje que estemos utilizando, para este ejemplo voy a utilizar la de C#, no es necesario descargar todo el proyecto, con el archivo .tt es suficiente, así que nos dirigimos a la siguiente dirección https://github.com/rene15009/ConfigManager/blob/master/ExampleCS/ y descargamos el archivo AppSettingsCS.tt

Una vez descargado lo agregamos a nuestro proyecto desde el explorador de soluciones, ojo si estamos agregándolo a un proyecto de tipo sitio web debemos agregarlo dentro de la carpeta App_Code de otro modo el Visual Studio generará la clase pero no será accesible desde la aplicación ya que el archivo .cs se genera en la misma carpeta donde esté la plantilla. Ahora tan sólo debemos seleccionar el archivo AppSettingsCS.tt y en el menú contextual seleccionar la opción ejecutar herramienta personalizada y dejemos que las máquinas trabajen por nosotros


Visual studio custom tool

Una vez hecho esto vemos como Visual Studio ha generado nuestro archivo AppSettingsCS.cs con la nuestra clase wrapper con una propiedad por cada uno de las entradas de configuración de nuetra aplicación.

T4 generate

En la plantilla he puesto algunas propiedades de configuración que indican como debe generarse la clase resultante.

Dim _ClassName="Settings"

Dim _Namespace=""

Dim _Heritable=false

_ClassName & Namespace con ellas situaremos nuestra clase según las convenciones de nuestra aplicación.

_Heritalble     Como veis la plantilla genera las propiedades estáticas, no heredables ni sobre escribibles,  sin embargo nos puede interesar en determinados escenarios poder condicionar un valor de configuración en función de otro, de la hora del servidor,  en ese caso nos podría interesar crear un código personalizado dentro del cuerpo de nuestras propiedades, para ello podemos establecer esta variable a true y de este modo nos generará una clase instanciable  de la cual podremos heredar y sobre escribir las propiedades que me interese.

En el siguiente post trataré de mostraros un ejemplo de ello y tratar de mejorar un poco más estas plantillas

Si os interesa el proyecto https://github.com/rene15009/ConfigManager  o tenéis alguna sugerencia os invito a hacerme un pull request https://github.com/rene15009/ConfigManager/pulls

Nos leemos, René Pacios

Acerca de René

René Pacios es un apasionado de la tecnología, autodidacta, emprendedor, le encanta el desarrollo web, para moviles, aplicaciones, todo aquello que automatice tareas y haga que las máquinas trabajen para él. Es un gran fan de las tecnologías Microsoft, y le encanta estar a la última siempre que el tiempo se lo permite. Siempre quiso ser cantante, pero creo que en esta vida se va a quedar sólo en canta-mañanas

No hay comentarios:

Publicar un comentario