Pregunta

¿Qué es un objeto proxy en el sentido de Inversión de control / Orientado a aspectos?

¿Algún buen artículo sobre qué es un objeto proxy?
¿Por qué querrías usar uno?
¿Y cómo escribir uno en C #?

¿Fue útil?

Solución

En general, un objeto Proxy es un objeto (instancia de una clase) que expone exactamente la misma interfaz pública que una "clase real". pero simplemente reenvía todas las llamadas realizadas a sus miembros a la otra clase real. Los objetos proxy se usan por varias razones ...

Uno de los propósitos es fingir " ser la clase real para que un componente (u objeto) del cliente pueda "creer" está hablando con el "real" objeto, pero dentro del proxy, se están haciendo otras cosas (como registro, soporte transaccional, etc.) al mismo tiempo ... En segundo lugar, un proxy puede ser muy barato en comparación con el objeto real. y a menudo se usa para que los objetos reales se puedan conservar (apagar o liberar a un grupo para que otros clientes lo usen) cuando el cliente no los está usando ... El proxy permanece "vivo". y el cliente cree que todavía tiene una conexión con el objeto real, pero cada vez que "llama" el objeto, en realidad está llamando al proxy, que va y obtiene otro objeto real solo para manejar la llamada, y luego libera el objeto real cuando finaliza la llamada.

En cuanto a Inversión de control (IOC) .. Eso se refiere a un patrón común (también conocido como Inyección de dependencia), donde los objetos dependientes dentro de una clase se inyectan " en una instancia de la clase, desde el código del cliente, para controlar qué versión de un objeto dependiente usará la instancia ... IOC se puede usar para inyectar un "Proxy". objeto en una clase donde cree que está usando el objeto real ... La frase Inversión de control se refiere al hecho de que cuando se usa este patrón, la decisión de qué implementación real se llama ya no se bajo el control de la clase que realiza la llamada, pero para el cliente de esa clase, cuando inyecta una instancia de un objeto dependiente en la clase que se utilizará para esta llamada.

Generalmente, el término IOC se usa con lo que se denomina IOC Container , que es una clase específicamente diseñada para ser responsable de crear instancias de clases dependientes basadas en información poco acoplada sobre esas clases (Tipos) que se obtiene de alguna fuente distinta de las dependencias cableadas (con mayor frecuencia, de algún tipo de archivo de configuración). En general, cuando usa un contenedor IOC, crea una instancia de él cuando se inicia la aplicación y luego (leyendo los datos de configuración o lo que sea), se "registra". cada una de las clases (tipos) de las que será responsable el contenedor IOC, con un valor clave. La clave suele ser el tipo abstracto o la interfaz que deben implementar todas las instancias de este registro). Luego, en las operaciones normales de su aplicación, donde de lo contrario podría haber actualizado una instancia de uno de estos tipos, llame al Contenedor IOC y solicite una instancia en su lugar, usando el tipo abstracto / Interfaz como clave . El contenedor IOC luego utiliza la reflexión o la carga dinámica (o lo que sea), para crear una instancia de cualquier tipo que haya sido "registrado". con esa llave De esta manera, simplemente cambiando los datos de configuración, puede controlar los tipos reales utilizados por la aplicación, cambiándolos en un entorno o ubicación de implementación de los utilizados en otro.

Otros consejos

Un muy buen recurso sobre esto es la antigua "Banda de los Cuatro" Libro de patrones de diseño. Este libro es muy útil para cualquiera que desarrolle software orientado a objetos. Personalmente estoy usando objetos proxy para la carga diferida con NHibernate. No uso proxies con inversión de control porque resuelvo los tipos interconectados solo con mi IoC.

La explicación de Charles Bretana es muy buena.

No puedo imaginar la relación entre proxy y AoP. ¿Alguien podría explicar eso aquí?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top