• RSS
  • Facebook
  • Twitter
  • Linkedin
  • Google +
  • Youtube

Spring.NET nos ofrece muchas facilidades para trabajar con programación orientada a aspectos (AOP).

Definición de AOP en Wikipedia

“La Programación Orientada a Aspectos (POA) es un paradigma de programación relativamente reciente cuya intención es permitir una adecuada modularización de las aplicaciones y posibilitar una mejor separación de incumbencias. Gracias a la POA se pueden encapsular los diferentes conceptos que componen una aplicación en entidades bien definidas, eliminando las dependencias entre cada uno de los módulos. De esta forma se consigue razonar mejor sobre los conceptos, se elimina la dispersión del código y las implementaciones resultan más comprensibles, adaptables y reusables.”

Vamos a explicar cómo podemos crear un proxy automáticamente cuando un advisor o guardián, intercepte una coincidencia con el patrón definido de captura de métodos en el pointcut.

Imaginemos que hemos creado una clase que registra en un log los errores que pueden arrojar los métodos al ejecutarse:

public class ExceptionInterceptor : IMethodInterceptor
 {
     protected static ILog Log = LogManager.GetCurrentClassLogger();

     public object Invoke(IMethodInvocation invocation)
     {
         object result = null;

         try
         {
             result = invocation.Proceed();
         }
         catch(Exception ex)
         {
             Log.Error(ex.Message);
         }

         return result;
     }
 }

Una vez programada la clase interceptora ExceptionInterceptor, vamos a crear la instancia oportuna en el contenedor de Spring.

También vamos a crear una instancia de tipo RegularExpressionMethodPointcutAdvisor, la cual nos ayuda mediante una expresión regular registrar qué métodos debe capturar.

Y por último creamos una instancia de tipo DefaultAdvisorAutoProxyCreator que será la encargada de crear el proxy automáticamente.

<?xml version="1.0" encoding="utf-8" ?>
<objects xmlns="http://www.springframework.net">
 
  <object id="aDao" type="TransitionOrm.Core.Data.Dao.ADao, TransitionOrm.Core" singleton="false"></object>
 
  <object id="exceptionAdvisor" type="Spring.Aop.Support.RegularExpressionMethodPointcutAdvisor, Spring.Aop">
    <property name="Advice" ref="exceptionInterceptor"></property>
    <property name="Patterns">
      <list>
        <value>.*GetById.*</value>
      </list>
    </property>
  </object>
 
  <object id="exceptionInterceptor" type="TransitionOrm.Core.Aop.ExceptionInterceptor, TransitionOrm.Core"></object>
 
  <object id="ProxyCreator" type="Spring.Aop.Framework.AutoProxy.DefaultAdvisorAutoProxyCreator, Spring.Aop"/>
 
</objects>

Una vez hecho esto, cuando el objeto “aDao” ejecute un método que contenga la palabra “GetById”, Spring se encargará de interceptarla y creará el proxy automáticamente, pasando la ejecución por la clase ExceptionInterceptor.

Este es un ejemplo de lo comentado anteriormente:

var context = ContextRegistry.GetContext();
_aDao = (IADao)context.GetObject("aDao");
var a = _aDao.GetById(1);

Como podéis ver, gracias a la clase DefaultAdvisorAutoProxyCreator nos facilita mucho la vida, por que ya no tenemos que crear un proxy por cada uno de los advisor que necesitemos en nuestra aplicación.

Librerías usadas(NuGet):
PM> Install-Package Common.Logging
PM> Install-Package Spring.Core -Version 1.3.2
PM> Install-Package Spring.Aop -Version 1.3.2
Framework .NET 4.0

The following two tabs change content below.
Empresa de Hosting & IT Consulting

Latest posts by Domitienda (see all)

Categorías: .NET

Deja un comentario