SlideShare uma empresa Scribd logo
1 de 42
AOP
&
@bolognabruno
@fabifernandez23
Agenda
•
•
•
•
•
•
•
•

¿Que es el mal diseño?
¿Que es AOP?
¿Como funciona AOP?
Tipos AOP
Postsharp
Vida de un aspecto
Out of the Box Aspects
Consideraciones con Postsharp
¿Que es el mal diseño?
• Recordemos momentos que nos vimos
enfrentados a código mal diseñado.
• Analicemos que características hacen que el
código no sea bueno.
¿Que es el mal diseño?
Dificultades de un mal diseño
• Muy difícil modificar código sin introducir
nuevos bugs.
• Por más que se corrijan bugs, el mal diseño se
mantiene y cada vez tiende a ser peor
Arreglar algo mal diseñado...
Ejemplo de código - MeetupApp
Un pequeño análisis
• Por cada bloque de código que queremos
encerrar en try/catch estamos utilizando al
menos 8 líneas más de código.
A la hora de crecer...
• 10 métodos que encierran código en bloques
try/catch representarían al menos 80 líneas de
código repetido
Esto no es nuevo...
• Un estudio publicado por IEEE TRANSACTIONS ON
SOFTWARE ENGINEERING demostró que la cantidad
de defectos en una funcionalidad están relacionadas
en dos factores:
1. La cantidad de lineas de código que componen
dicha funcionalidad .
2. La repetición de dicha funcionalidad a traves de
varios artefactos de código.
Ademas...
• También demostró que las responsabilidades
"cross-cutting" repetidas en la aplicación
suelen tener más defectos que las clásicas
funcionalidades de negocio.
¿Que es AOP?
• AOP es una técnica de desarrollo de software
que apunta a incrementar la modularidad
permitiendo separación de responsabilidades
"cross-cutting".
• Esta técnica complementa y no remplaza el
paradigma actual de programación orientada
a objetos.
¿Que es AOP?
• Con AOP podemos definir funcionalidad
"cross-cutting" en un único lugar y aplicarla
declarativamente donde sea necesario sin
modificar la clase donde aplica esta
funcionalidad.
Responsabilidades cross-cutting
•
•
•
•
•
•

Logging
Auditoria
Transacciones
Locking & thread dispatching
Caching
Exception handling
Principios que cumple AOP
• DRY (Don't Repeat Yourself)
• Principios SOLID
•
Single Responsibility
•
OPEN/CLOSE
¿Como funciona AOP?
Identificamos responsabilidades CrossCutting
Creamos un aspecto para dicha
responsabilidad
Aplicamos el aspecto a nuestras clases
Tipos AOP
Interceptors
• Usa el patrón DynamicProxy
• Se resuelve en tiempo de ejecución
IL Code Weaving
• Inyecta código en tiempo de compilación
• No usan DynamicProxy
Interceptors
IL Code Weaving
Comparación de frameworks
Features de cada framework
De que forma podemos aplicar
aspectos
Otros puntos importantes
http://postsharp.net
Vida de un Aspecto
• Compila tu assembly
• Entra PostSharp a jugar:
– Se instancia el aspecto para el target code
– CompileTimeValidation
– CompileTimeInitialization
– Serialización por target code
• Managed resource
– Binary stream (default)
– XML
– MSIL

Compile
Time
Vida de un Aspecto
• Run Time
– Deserialización
– RunTimeInitialize (1 vez – la app está lista)
– RunTimeInstanceInitialize (cada vez que el target
code se inicializa)
– Ejecución del advice

• Ctor() no se ejecuta en Run Time
OnMethodBoundaryAspect
• Aspecto a nivel de método
– OnEntry
– OnExit
– OnException
– OnSuccess
OnExceptionAspect
• Aspecto a nivel de método
– OnException
– GetExceptionType
LocationInterceptionAspect
• Aspecto a nivel de propiedades y campos
• Permite interceptar Get y Set
– OnGetValue
– OnSetValue

• Operaciones útiles
– ProceedGetValue()
– ProceedSetValue()
– GetCurrentValue()
– SetNewValue()
EventInterceptionAspect
• Aspecto a nivel de eventos
– OnAddHandler (+=)
– OnRemoveHandler(-=)
– OnInvokeHandler

• Operaciones útiles
– ProceedAddHandler()
– ProceedRemoveHandler()
Aplicando P# a codigo existente
• Buscar código que sea claramente un patrón
decorador
• Buscar aspectos que no interactuen con el target
code
• Elegir la mejor forma de agregarlos: multicast o
atributos individuales
– Individual = más control
– Multicast = más fácil pero el código debe estar bien
organizado para tener control

• TEST, TEST, TEST!
Aplicando P# a codigo existente
• Verificar que no hay efectos secundarios
– Considerar los aspectos como islas de alta
encapsulación
– Sólo lectura de la meta data del target code
– No intentar alterar el flujo de ejecución
Aplicando P# a codigo existente
• Arrancar con lo más papa!
– Logging & Tracing
– Monitoreo de performance
– Caching
– Exception handling
Deployment
• PostSharp.dll y listo!
• Si usas ILMarge
– Merge de varios assemblies en uno
– Se complica un poco!

• Si firmas los assemblies, usar delay signing
• Obfuscas tu código?
– Sólo soporta dotFuscator
GRACIAS!
Referencias
•
•
•
•
•
•
•

Dynamic Decorator Pattern http://goo.gl/DkIe1t
Dynamic Proxies http://goo.gl/ql6Zly
Documentación PostSharp http://goo.gl/mH3l6J
White-paper AOP http://goo.gl/Mtzy0u
Artículo Técnico PostSharp http://goo.gl/NxD380
Presentaciones AOP http://goo.gl/v6OYmm
Aspect Oriented Programming in .NET
http://goo.gl/HNKlaA
• PostSharp Fundamentals http://goo.gl/LPIawa
• ILSpy http://ilspy.net/

Mais conteúdo relacionado

Mais procurados

Mais procurados (20)

TestingAR V - Una Nueva Visión - Federico Toledo - Performance Durante y Des...
TestingAR V - Una Nueva Visión - Federico Toledo - Performance Durante y Des...TestingAR V - Una Nueva Visión - Federico Toledo - Performance Durante y Des...
TestingAR V - Una Nueva Visión - Federico Toledo - Performance Durante y Des...
 
DotNet 2019 | Alberto Varela - Infraestructura como código en Azure
DotNet 2019 | Alberto Varela - Infraestructura como código en AzureDotNet 2019 | Alberto Varela - Infraestructura como código en Azure
DotNet 2019 | Alberto Varela - Infraestructura como código en Azure
 
Análisis estático de código en Java
Análisis estático de código en JavaAnálisis estático de código en Java
Análisis estático de código en Java
 
Scrum overview
Scrum overview Scrum overview
Scrum overview
 
Escalando workloads serverless en Kubernetes con Keda
Escalando workloads serverless en Kubernetes con KedaEscalando workloads serverless en Kubernetes con Keda
Escalando workloads serverless en Kubernetes con Keda
 
.NET Core 1.0 y ASP.NET Core 1.0
.NET Core 1.0 y ASP.NET Core 1.0.NET Core 1.0 y ASP.NET Core 1.0
.NET Core 1.0 y ASP.NET Core 1.0
 
Integración y Entrega Continua con Visual Studio Online
Integración y Entrega Continua con Visual Studio OnlineIntegración y Entrega Continua con Visual Studio Online
Integración y Entrega Continua con Visual Studio Online
 
Cómo iniciarme en el mundo de la automatización de pruebas
Cómo iniciarme en el mundo de la automatización de pruebasCómo iniciarme en el mundo de la automatización de pruebas
Cómo iniciarme en el mundo de la automatización de pruebas
 
Testing como parte de la cultura DevOps
Testing como parte de la cultura DevOpsTesting como parte de la cultura DevOps
Testing como parte de la cultura DevOps
 
Probando aplicaciones AngularJS
Probando aplicaciones AngularJSProbando aplicaciones AngularJS
Probando aplicaciones AngularJS
 
Automatizacion de Pruebas
Automatizacion de PruebasAutomatizacion de Pruebas
Automatizacion de Pruebas
 
Swift migration. the true history
Swift migration. the true historySwift migration. the true history
Swift migration. the true history
 
Ejecutando pruebas automatizadas desde la nube
Ejecutando pruebas automatizadas desde la nubeEjecutando pruebas automatizadas desde la nube
Ejecutando pruebas automatizadas desde la nube
 
Magallanes - PHPmvd Meet Up - Mayo 2014
Magallanes - PHPmvd Meet Up - Mayo 2014Magallanes - PHPmvd Meet Up - Mayo 2014
Magallanes - PHPmvd Meet Up - Mayo 2014
 
Aug frontend dev ops
Aug frontend dev opsAug frontend dev ops
Aug frontend dev ops
 
Integración contínua con Jenkins
Integración contínua con JenkinsIntegración contínua con Jenkins
Integración contínua con Jenkins
 
Proceso desarrollo de fábrica de software
Proceso desarrollo de fábrica de softwareProceso desarrollo de fábrica de software
Proceso desarrollo de fábrica de software
 
Workshop Calabash Appium
Workshop Calabash AppiumWorkshop Calabash Appium
Workshop Calabash Appium
 
Introducción a la automatización de pruebas con tecnologías .Net
Introducción a la automatización de pruebas con tecnologías .NetIntroducción a la automatización de pruebas con tecnologías .Net
Introducción a la automatización de pruebas con tecnologías .Net
 
Clean code 9
Clean code 9Clean code 9
Clean code 9
 

Destaque (8)

.NET UY Meetup 7 - CLR Memory by Fabian Alves
.NET UY Meetup 7 - CLR Memory by Fabian Alves.NET UY Meetup 7 - CLR Memory by Fabian Alves
.NET UY Meetup 7 - CLR Memory by Fabian Alves
 
.NET UY Meetup 7 - ICBanking Apps by Gonzalo Pelós & Gabriel Monteagudo
.NET UY Meetup 7 - ICBanking Apps by Gonzalo Pelós & Gabriel Monteagudo.NET UY Meetup 7 - ICBanking Apps by Gonzalo Pelós & Gabriel Monteagudo
.NET UY Meetup 7 - ICBanking Apps by Gonzalo Pelós & Gabriel Monteagudo
 
.NET UY Meetup 6 - Integrando con C/C++ por medio de P/Invoke by Juan Ramirez
.NET UY Meetup 6 - Integrando con C/C++ por medio de P/Invoke by Juan Ramirez.NET UY Meetup 6 - Integrando con C/C++ por medio de P/Invoke by Juan Ramirez
.NET UY Meetup 6 - Integrando con C/C++ por medio de P/Invoke by Juan Ramirez
 
.NET UY Meetup 5 - MVC For Human Beings by Leonardo Botta
.NET UY Meetup 5 - MVC For Human Beings by Leonardo Botta.NET UY Meetup 5 - MVC For Human Beings by Leonardo Botta
.NET UY Meetup 5 - MVC For Human Beings by Leonardo Botta
 
.NET UY Meetup 6 - Xamarin: Desarrollando apps nativas para iOS & Android en ...
.NET UY Meetup 6 - Xamarin: Desarrollando apps nativas para iOS & Android en ....NET UY Meetup 6 - Xamarin: Desarrollando apps nativas para iOS & Android en ...
.NET UY Meetup 6 - Xamarin: Desarrollando apps nativas para iOS & Android en ...
 
.NET UY Meetup 3 - Presentaciones Efectivas by Ariel Erlijman
.NET UY Meetup 3 - Presentaciones Efectivas by Ariel Erlijman.NET UY Meetup 3 - Presentaciones Efectivas by Ariel Erlijman
.NET UY Meetup 3 - Presentaciones Efectivas by Ariel Erlijman
 
Poo 1
Poo 1Poo 1
Poo 1
 
Single Page Applications
Single Page ApplicationsSingle Page Applications
Single Page Applications
 

Semelhante a .NET UY Meetup 4 - AOP & PostSharp by Bruno Bologna & Fabian Fernandez

DeSymfonyDay 2014 - To mock or not to mock - Spanish
DeSymfonyDay 2014 - To mock or not to mock - SpanishDeSymfonyDay 2014 - To mock or not to mock - Spanish
DeSymfonyDay 2014 - To mock or not to mock - Spanish
Jordi Llonch
 
DeSymfonyDay 2014 - To mock or not to mock - Spanish
DeSymfonyDay 2014 - To mock or not to mock - SpanishDeSymfonyDay 2014 - To mock or not to mock - Spanish
DeSymfonyDay 2014 - To mock or not to mock - Spanish
Jordi Llonch
 
DeSymfonyDay 2014 - To mock or not to mock - Spanish
DeSymfonyDay 2014 - To mock or not to mock - SpanishDeSymfonyDay 2014 - To mock or not to mock - Spanish
DeSymfonyDay 2014 - To mock or not to mock - Spanish
Akamon Engineering
 

Semelhante a .NET UY Meetup 4 - AOP & PostSharp by Bruno Bologna & Fabian Fernandez (20)

ASP.NET MVC Workshop Día 2
ASP.NET MVC Workshop Día 2ASP.NET MVC Workshop Día 2
ASP.NET MVC Workshop Día 2
 
Meetup Oracle Technology MAD_BCN: 6.2 DevOps y DataOps
Meetup Oracle Technology MAD_BCN: 6.2 DevOps y DataOpsMeetup Oracle Technology MAD_BCN: 6.2 DevOps y DataOps
Meetup Oracle Technology MAD_BCN: 6.2 DevOps y DataOps
 
Buenas practicas desarrollando software
Buenas practicas desarrollando softwareBuenas practicas desarrollando software
Buenas practicas desarrollando software
 
"Al rico" PHP
"Al rico" PHP"Al rico" PHP
"Al rico" PHP
 
VLCTechFest - Simplificando Controladores: Una introducción a Action-Domain ...
VLCTechFest -  Simplificando Controladores: Una introducción a Action-Domain ...VLCTechFest -  Simplificando Controladores: Una introducción a Action-Domain ...
VLCTechFest - Simplificando Controladores: Una introducción a Action-Domain ...
 
DeSymfonyDay 2014 - To mock or not to mock - Spanish
DeSymfonyDay 2014 - To mock or not to mock - SpanishDeSymfonyDay 2014 - To mock or not to mock - Spanish
DeSymfonyDay 2014 - To mock or not to mock - Spanish
 
DeSymfonyDay 2014 - To mock or not to mock - Spanish
DeSymfonyDay 2014 - To mock or not to mock - SpanishDeSymfonyDay 2014 - To mock or not to mock - Spanish
DeSymfonyDay 2014 - To mock or not to mock - Spanish
 
DeSymfonyDay 2014 - To mock or not to mock - Spanish
DeSymfonyDay 2014 - To mock or not to mock - SpanishDeSymfonyDay 2014 - To mock or not to mock - Spanish
DeSymfonyDay 2014 - To mock or not to mock - Spanish
 
Desarrollo de Software Guiado por Pruebas
Desarrollo de Software Guiado por PruebasDesarrollo de Software Guiado por Pruebas
Desarrollo de Software Guiado por Pruebas
 
Practicas tecnicas
Practicas tecnicasPracticas tecnicas
Practicas tecnicas
 
Introducción a la programación orientada a aspectos
Introducción a la programación orientada a aspectosIntroducción a la programación orientada a aspectos
Introducción a la programación orientada a aspectos
 
Introducción a tdd
Introducción a tddIntroducción a tdd
Introducción a tdd
 
Módulo 4. Desarrollador ágil
Módulo 4. Desarrollador ágilMódulo 4. Desarrollador ágil
Módulo 4. Desarrollador ágil
 
Practicas técnicas
Practicas técnicasPracticas técnicas
Practicas técnicas
 
Desarrollo con Java y metodologías agiles
Desarrollo con Java y metodologías agilesDesarrollo con Java y metodologías agiles
Desarrollo con Java y metodologías agiles
 
Desarrollo modermo de aplicaciones web
Desarrollo modermo de aplicaciones webDesarrollo modermo de aplicaciones web
Desarrollo modermo de aplicaciones web
 
Grails barcamp 2013
Grails barcamp 2013Grails barcamp 2013
Grails barcamp 2013
 
Grails 2013 - PUCMM - Santiago - Sistemas
Grails 2013 - PUCMM - Santiago - SistemasGrails 2013 - PUCMM - Santiago - Sistemas
Grails 2013 - PUCMM - Santiago - Sistemas
 
ASP.NET MVC
ASP.NET MVCASP.NET MVC
ASP.NET MVC
 
Angular Fundamentals
Angular FundamentalsAngular Fundamentals
Angular Fundamentals
 

Último

Modulo-Mini Cargador.................pdf
Modulo-Mini Cargador.................pdfModulo-Mini Cargador.................pdf
Modulo-Mini Cargador.................pdf
AnnimoUno1
 

Último (11)

PROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptxPROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
 
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptxEL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
 
Avances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvanaAvances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvana
 
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
 
Refrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdf
Refrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdfRefrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdf
Refrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdf
 
Avances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estosAvances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estos
 
Modulo-Mini Cargador.................pdf
Modulo-Mini Cargador.................pdfModulo-Mini Cargador.................pdf
Modulo-Mini Cargador.................pdf
 
pruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITpruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNIT
 
EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptx
EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptxEVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptx
EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptx
 
Innovaciones tecnologicas en el siglo 21
Innovaciones tecnologicas en el siglo 21Innovaciones tecnologicas en el siglo 21
Innovaciones tecnologicas en el siglo 21
 
How to use Redis with MuleSoft. A quick start presentation.
How to use Redis with MuleSoft. A quick start presentation.How to use Redis with MuleSoft. A quick start presentation.
How to use Redis with MuleSoft. A quick start presentation.
 

.NET UY Meetup 4 - AOP & PostSharp by Bruno Bologna & Fabian Fernandez

  • 2. Agenda • • • • • • • • ¿Que es el mal diseño? ¿Que es AOP? ¿Como funciona AOP? Tipos AOP Postsharp Vida de un aspecto Out of the Box Aspects Consideraciones con Postsharp
  • 3. ¿Que es el mal diseño? • Recordemos momentos que nos vimos enfrentados a código mal diseñado. • Analicemos que características hacen que el código no sea bueno.
  • 4. ¿Que es el mal diseño?
  • 5. Dificultades de un mal diseño • Muy difícil modificar código sin introducir nuevos bugs. • Por más que se corrijan bugs, el mal diseño se mantiene y cada vez tiende a ser peor
  • 6. Arreglar algo mal diseñado...
  • 7. Ejemplo de código - MeetupApp
  • 8. Un pequeño análisis • Por cada bloque de código que queremos encerrar en try/catch estamos utilizando al menos 8 líneas más de código.
  • 9. A la hora de crecer... • 10 métodos que encierran código en bloques try/catch representarían al menos 80 líneas de código repetido
  • 10. Esto no es nuevo... • Un estudio publicado por IEEE TRANSACTIONS ON SOFTWARE ENGINEERING demostró que la cantidad de defectos en una funcionalidad están relacionadas en dos factores: 1. La cantidad de lineas de código que componen dicha funcionalidad . 2. La repetición de dicha funcionalidad a traves de varios artefactos de código.
  • 11. Ademas... • También demostró que las responsabilidades "cross-cutting" repetidas en la aplicación suelen tener más defectos que las clásicas funcionalidades de negocio.
  • 12. ¿Que es AOP? • AOP es una técnica de desarrollo de software que apunta a incrementar la modularidad permitiendo separación de responsabilidades "cross-cutting". • Esta técnica complementa y no remplaza el paradigma actual de programación orientada a objetos.
  • 13. ¿Que es AOP? • Con AOP podemos definir funcionalidad "cross-cutting" en un único lugar y aplicarla declarativamente donde sea necesario sin modificar la clase donde aplica esta funcionalidad.
  • 15. Principios que cumple AOP • DRY (Don't Repeat Yourself) • Principios SOLID • Single Responsibility • OPEN/CLOSE
  • 18. Creamos un aspecto para dicha responsabilidad
  • 19. Aplicamos el aspecto a nuestras clases
  • 20. Tipos AOP Interceptors • Usa el patrón DynamicProxy • Se resuelve en tiempo de ejecución IL Code Weaving • Inyecta código en tiempo de compilación • No usan DynamicProxy
  • 24. Features de cada framework
  • 25. De que forma podemos aplicar aspectos
  • 27.
  • 29. Vida de un Aspecto • Compila tu assembly • Entra PostSharp a jugar: – Se instancia el aspecto para el target code – CompileTimeValidation – CompileTimeInitialization – Serialización por target code • Managed resource – Binary stream (default) – XML – MSIL Compile Time
  • 30. Vida de un Aspecto • Run Time – Deserialización – RunTimeInitialize (1 vez – la app está lista) – RunTimeInstanceInitialize (cada vez que el target code se inicializa) – Ejecución del advice • Ctor() no se ejecuta en Run Time
  • 31. OnMethodBoundaryAspect • Aspecto a nivel de método – OnEntry – OnExit – OnException – OnSuccess
  • 32. OnExceptionAspect • Aspecto a nivel de método – OnException – GetExceptionType
  • 33. LocationInterceptionAspect • Aspecto a nivel de propiedades y campos • Permite interceptar Get y Set – OnGetValue – OnSetValue • Operaciones útiles – ProceedGetValue() – ProceedSetValue() – GetCurrentValue() – SetNewValue()
  • 34. EventInterceptionAspect • Aspecto a nivel de eventos – OnAddHandler (+=) – OnRemoveHandler(-=) – OnInvokeHandler • Operaciones útiles – ProceedAddHandler() – ProceedRemoveHandler()
  • 35.
  • 36. Aplicando P# a codigo existente • Buscar código que sea claramente un patrón decorador • Buscar aspectos que no interactuen con el target code • Elegir la mejor forma de agregarlos: multicast o atributos individuales – Individual = más control – Multicast = más fácil pero el código debe estar bien organizado para tener control • TEST, TEST, TEST!
  • 37. Aplicando P# a codigo existente • Verificar que no hay efectos secundarios – Considerar los aspectos como islas de alta encapsulación – Sólo lectura de la meta data del target code – No intentar alterar el flujo de ejecución
  • 38. Aplicando P# a codigo existente • Arrancar con lo más papa! – Logging & Tracing – Monitoreo de performance – Caching – Exception handling
  • 39. Deployment • PostSharp.dll y listo! • Si usas ILMarge – Merge de varios assemblies en uno – Se complica un poco! • Si firmas los assemblies, usar delay signing • Obfuscas tu código? – Sólo soporta dotFuscator
  • 40.
  • 42. Referencias • • • • • • • Dynamic Decorator Pattern http://goo.gl/DkIe1t Dynamic Proxies http://goo.gl/ql6Zly Documentación PostSharp http://goo.gl/mH3l6J White-paper AOP http://goo.gl/Mtzy0u Artículo Técnico PostSharp http://goo.gl/NxD380 Presentaciones AOP http://goo.gl/v6OYmm Aspect Oriented Programming in .NET http://goo.gl/HNKlaA • PostSharp Fundamentals http://goo.gl/LPIawa • ILSpy http://ilspy.net/