AppSettings con tipado fuerte y como usar un archivo externo
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.
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
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.
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
No hay comentarios:
Publicar un comentario