Agregando referencias
Como primer paso veremos el uso de que librerías hay que utilizar para poder hacer uso de la programación orientada a aspectos. Yo he elegido Spring.Net pero se puede elegir cualquier otro framework, a mi me gusta Spring por la filosofía que tiene de poco dependencia de su código y que propone muy buenas soluciones en diferentes aspectos, como NHibernate y recientemente el nuevo proyecto, por cierto muy interesante, GemFire, una solución escalable de datos para grandes plataformas.
Paso a nombrar las DLLs que usaremos:
- Spring.Aop.dll
- Spring.Core.dll
- log4net.dll (Log de debug)
- Common.Logging.dll (Log)
- Common.Logging.Log4Net.dll (Log)
A continuación elegiremos un proyecto para generar donde incluir estas dlls, ya puede ser un proyecto de consola, Windows Forms, WPF como en este caso…
Configurando Spring.Net
Lo primero que haremos será añadir un fichero de configuración App.config o Web.config, el único inconveniente que tiene Spring.Net es que la configuración puede aumentar bastante de tamaño dependiendo del numero de objetos que queramos declarar en su contexto, por ello me gusta separar la declaración de objetos en uno o varios ficheros independientes fuera del config
<!-- Spring --> <spring> <context> <resource uri="~/Config/Spring.xml"/> </context> </spring>
El archivo Spring.xml habrá que ponerlo como contenido y que se copie siempre en el directorio para que pueda encontrarlo y realizar la carga de los objetos del contexto.
Esta es mi declaración de los Advisors (que realizaran las funciones dependiendo del tipo de Advisor que sean, antes de la llamada, después, durante…)
<object id="loggingBeforeAdvice"type="aopSample.Desktop.Advisors.LoggingBeforeAdvice,aopSample.Desktop"></object><object id="loggingAfterAdvice"type="aopSample.Desktop.Advisors.LoggingAfterAdvice,aopSample.Desktop"> </object> <object id="exceptionThrowsAdvice"type="aopSample.Desktop.Advisors.ExceptionThrowsAdvice,aopSample.Desktop"
</object>
Como veis lo único que hago es declarar cada clase con un identificador y el tipo que se corresponde con mi clase para que lo maneje el contexto de Spring.net
Por último habrá que declarar el objeto en el que vamos a inyectar los aspectos y aquí es donde muestra su gran potencial
<object id="simpleServiceProxy" type="Spring.Aop.Framework.ProxyFactoryObject"> <property name="target"> <object id="simpleService"
type="aopSample.Desktop.Services.SimpleService, aopSample.Desktop" /> </property> <property name="InterceptorNames"> <list> <value>loggingBeforeAdvice</value> <value>loggingAfterAdvice</value> <value>exceptionThrowsAdvice</value> </list> </property> </object>
Como vemos lo que hacemos es declarar el Proxy que se encarga de generar la factory de spring ProxyFactoryObject que envuelve nuestro objeto declarado en el target e inyectarle los Advisors que ejecutara.
Como vimos en el post anterior hay muchas clases para poder usar la AOP, pero Spring nos simplifica bastante este paso mediente la configuración creando todas estas clases intermedias el solo.
Es muy importante generar una interfaz de nuestro simpleService, para que Spring.Net puede realizar las llamadas a nuestros Advisors, ya sea con Refactor-> Extract Interface o manualmente.
Probando nuestro proyecto
Lo primero que haremos será crear el contexto de Spring
IApplicationContext
_ctx = ContextRegistry.GetContext();
Y luego pedirle a Spring nuestro objeto proxy y realizar la llamada a un método para que lanze nuestros Advisor y ver que funcionen
ISimpleService simpleService =
_ctx.GetObject("simpleServiceProxy") as ISimpleService; simpleService.DoSomethingComplex();
Por ultimo y para que todo esto funcione deberemos haber creado nuestros Advisors que lo único que requieren es que se implemente una interfaz dependiendo del tipo de advisor que queramos crear que los tenéis declarados aquí Advice Types
Os dejo el proyecto para que podáis descargarlo y probar el funcionamiento con todas las partes montadas.
Descargar
Un saludo espero que os haya gustado 🙂