/ / ¿Cómo utilizar POCO proxy en tiempo de ejecución? - .net, proxy, poco

¿Cómo utilizar POCO proxy en tiempo de ejecución? - .net, proxy, poco

Me gustaría poder crear un proxy en tiempo de ejecución para un POCO, en el mismo estilo que lo haría en Java usando el JRE o cglib proxying de bibliotecas.

He visto Castle DynamicProxy que parece que encaja, pero la documentación no es genial. También me sorprende que este tipo de cosas no esté en el .Net Framework en sí.

Alguien:

  • ¿Conoce algún buen recurso para Castle DynamicProxy?
  • ¿Conoce algún enfoque alternativo?

¡Gracias!

Respuestas

2 para la respuesta № 1

Esto puede no valer mucho como las respuestas van, pero unode los motivos por los que no se ve una proliferación de proxies dinámicos en .NET es que los lenguajes .NET más comunes (C #, VB.NET) difieren de Java en un aspecto muy importante:

En Java, todos los métodos son virtuales a menos que se declare explícitamente sellado.

En C # (y VB.NET IIRC) todos los métodos y propiedades están sellados a menos que se declare explícitamente virtual.

Esto significa que el valor potencial de una dinámicael proxy es mucho más bajo en .NET que en Java. Tienes que diseñar explícitamente tus objetos .NET para que sean "proxyable", y la mayoría de la gente no lo hace; se necesita una decisión consciente para hacer que un objeto .NET sea "proxyable".

En realidad, es muy raro ver un proxy dinámico .NET fuera de Contenedores DI que no puedo pensar en ningún otro proxy dinámico que Castle.

Tenga en cuenta que el comportamiento "sellado por defecto" es una característica de .NET idiomas - es muy concebible que uno pueda diseñar a.Lenguaje basado en NET que tiene el mismo comportamiento "virtual por defecto" que Java. Aunque no conozco ninguno, me sorprendería que ese lenguaje no exista. Después de todo, todo está en el compilador.


1 para la respuesta № 2

"También me sorprende que este tipo de cosas no esté en el propio .Net Framework".

Ahi esta. Aunque no es completo, elegante o de rendimiento. Puede usar crear un proxy genérico que herede de RealProxy y tal vez tome el objeto a ser proxy. Para obtener el proxy, obtienes un proxy transparente de tu realproxy y le echas el tipo de wrapee (¿es una palabra?). Ahora tienes un proxy. Todos los métodos en el proxy se pueden manejar en una Invocación anulada (mensaje de IMessage ) en su RealProxy. Páselos como están a su objeto real (wrapee) o hagan cualquier otra cosa entre ellos.

Cavets: Su objeto a ser proxy debe heredar de MarshalByRef. Es bastante lento No lo usaría para la funcionalidad que se usa con frecuencia. Esta es toda la infraestructura remota que se juega aquí. ILgen es la mejor manera en la mayoría de los casos, pero hay algunos casos en los que he tenido que usar dicho método.