Tratar con Proxies en Castle Windsor

Cuando estás usando Dynamic Proxy, ya sea directamente o para aplicar AOP con Castle Windsor, a veces es necesario distinguir si una instancia de un objeto es una instancia real o un proxy generado.

Esto es frecuente cuando desde la infraestructura de la aplicación necesitamos acceder a metainformación de alguna clase, por ejemplo, el espacio de nombres en que está declarada, si tiene algún atributo, etc.

Si estamos usando proxies como los que genera Windsor al crear los interceptores, la instancia que tenemos pertenece a una clase generada al vuelo que actúa como decorador de la instancia real, por lo que no tenemos una forma directa de obtener el tipo real para acceder a esa metainformación.

Esto lo podemos solventar usando el interface IProxyTargetAccessor, que es implementado por todas los proxies generados por Dynamic Proxy y nos permite acceder a la instacia real:

var proxy = GetSomeProxy();
var actualInstance = (proxy as IProxyTargetAccessor).DynProxyGetTarget();

Sin embargo, existe una alternativa mucho mejor: utilizar la clase ProxyUtil, que nos permite:

  • Obtener la instancia encapsulada por el proxy.
  • Obtener el tipo sobre el que está contruido el proxy.
  • Detectar si un objeto es un proxy.
  • Detectar si un tipo es un proxy.