AOP: Intercepción o Inyección
Aplicar AOP en el entorno .NET tiene varias posibilidades, pero a la hora de decidir cual es la más aconsejable es posible que no exista un respuesta valida para todos los casos. El modelo de AOP se puede aplicar mediante Intercepción de llamadas de objetos o por Inyección de código en ejecución. El modelo de intercepción se puede usar facilmente desde .NET, en algunos casos incluyo existen elementos de la plataforma que hacen uso de este sistema:
- Extensiones SOAP para los WebServices
- Attributos de Operación, Contrato, etc sobre WCF
- EnterpriseServices
- Code Access Security
- Serialización
A la hora de emular este comportamiento, disponemos también de los mecanismos necesarios para poder crear nuestro propio motor de aspectos (disponibles desde las primeras versiones de .NET). Os remito a los siguientes artículos para que podais ver ejemplos y poder descargar el código fuente de demostración: Decouple Components by Injecting Custom Services into Your Object's Interception Chain Aspect-Oriented Programming Enables Better Code Encapsulation and Reuse En el caso de Inyección de Código, existen articulos muy completos de como llevar a cabo la construcción de un motor de AOP, pero existiendo Frameworks de AOP mi primera recomendación es que echeis un vistazo a estas últimas. En el siguiente articulo, podreis encontrar información de AOP basada en Inyección de código y referencias a dichas Frameworks: Aspect-Oriented Programming Aunque para aquellos que quieran profundizar en el tema, voy a entrar un poco en la inyección de código en .NET y como crear un motor de AOP con este sistema. En este sentido, el articulo que más me ha gustado es AOP using System.Reflection.Emit - Code Injection IL que muestra como hacer uso de Emit para mediante código IL poder emular el comportamiento de un motor AOP. Aunque creo que es un articulo muy interesante, mi recomendación es que lo useis con precaución puesto que la ventaja de un motor de AOP frente a construir uno propio es el nivel y numero de pruebas al que lo tendremos que someter. Para terminar simplemente hacer una reseña de un punto que no podemos oviar: Rendimiento. Como es obvio AOP nos facilita el trabajo de separación de conceptos pagando el peaje de impactar en el rendimiento. Como es obvio lo motores que se basen en Inyección de código pueden ser más facilmente optimizados (al fin y al cabo es código) que los basados en Intercepción (cuyo comportamiento es más genérico). Esto no significa que tengamos que descartar a uno en favor de otro, lo ideal es probar y utilizar el que mejor se adapte a nuestras caracteristicas (no solo rendimiento, sino facilidad, flexibilidad, etc).