tier programacion ejemplos capas wcf nhibernate serialization n-tier

wcf - programacion - gráfico de objeto transversal desde el cliente n-tier



programacion en capas c# ejemplos (3)

Actualmente soy un estudiante que incursiona en una aplicación .Net n-tier que usa Nhibernate + WCF + WPF.

Una de las cosas que se hace bastante terriblemente es la serialización de gráficos de objetos, de hecho no se hace del todo, actualmente se ignoran las asociaciones y estamos usando DTO en todas partes.

Por lo que puedo decir, un método para proceder es predefinir qué objetos y colecciones se deben cargar y serializar para cruzar el cable, y así poder presentar algunas asociaciones al cliente, sin embargo, esto parece limitado, inflexible e inconsistente (¿puedes Dile que no me gusta esta idea).

Una opción que se me ocurrió fue simplemente reemplazar NHProxies esa recolección de carga lenta en el nivel del cliente con un "Proxy desconectado "que recuperaría las cosas asociadas a través del cable. Esto significaría que tendríamos que expandir un poco la firma de nuestro servicio web y hacer algunos hackers en nuestros proxies generados, pero esto parecía ser un buen experimento genético de código T4 / otro.

Por lo que puedo decir, esto parece ser un obstáculo común, pero después de leer mucho no he podido encontrar ninguna solución buena / generalmente aceptada. Estoy buscando un poco de dirección tanto como cualquier solución en particular, pero si hay una manera fácil de hacer que el cliente se sienta "conectado", por favor hágamelo saber.


Ha pasado un tiempo para mí, pero los proxies de inyección / desconectados pueden no ser tan malos como parecen. Ya que eres un estudiante, voy a asumir que tienes algo de tiempo y quiero ensuciar un poco.

Si desea inyectar su propia lógica personalizada de serialización / deserialización, puede usar IDataContractSurrogate que puede aplicarse utilizando DataContractSerializerOperationBehavior . Solo he hecho algunas cosas básicas con esto, pero puede valer la pena investigarlo. Al agregar un poco de lógica divertida (léase: potencialmente hackosa) en esta capa, es posible que pueda estar más conectado.

Aquí hay una publicación de MSDN sobre alguien que llegó a la misma conclusión, DynamicProxy utilizado por NHibernate hace que no sea posible serializar directamente los objetos NHibernate que realizan cargas diferidas.


Usted hace una muy buena pregunta que desafortunadamente no tiene una respuesta muy clara. Incluso si pudieras obtener una carga lenta para trabajar sobre WCF (lo cual pudimos hacer) aún tendrías problemas al usar el interceptor de proxy. ¡Confíe en mí en este caso, quiere objetos POCO en el nivel del cliente!

Lo que realmente necesita considerar ... lo que se ha concebido como el enfoque estándar de la industria para este problema a partir de la investigación que he visto, se llama persistencia vs. uso o ignorancia de persistencia . En otras palabras, su modelo de objetos y asignaciones representan su dominio de persistencia pero no coincide con sus escenarios de uso ideales. No querrás llevar toda la base de datos al cliente solo para mostrar un par de propiedades ¿verdad?

Parece un problema tan simple, pero la solución es muy simple o muy compleja. Por un lado, puede diseñar sus entidades alrededor de los escenarios de uso, pero luego termina con la proliferación de su dominio de objetos, lo que dificulta su mantenimiento. Por otro lado, aún desea las relaciones de modelo de objetos enriquecido para escribir lógica empresarial granular.

Para simplificar este problema, examinemos los dos vacíos principales que debemos llenar ... entre la base de datos y la capa de la base de datos / servicio y la brecha entre el servicio y el cliente. NHibernate llena el primero simplemente proporcionando un ORM para cargar datos en sus objetos. Hace un trabajo decente, pero para lograr un gran rendimiento, debe modificarse utilizando estrategias de carga personalizadas. Me estoy desviando ...

La segunda brecha, entre el servidor y el cliente, es donde las cosas se ponen difíciles. Para simplificar, imagina si no enviaste ninguna entidad mapeada por el cable al cliente. Intente crear un mecanismo que intercambie entidades comerciales en objetos DTO y objetos DTO en entidades comerciales. De esta forma, su cliente solo trata con DTO (POCO por supuesto), y su lógica comercial puede mantener su estructura rica. Esto le permite aprovechar no solo el mecanismo de carga diferida de NHibernate, sino también otros beneficios de la sesión, como la memoria caché L1.

Por motivos de brevedad y propiedad intelectual, no entraré en el diseño de dicho mecanismo, pero espero que esta sea información suficiente para orientarlo en la dirección correcta. Si no le importa el rendimiento o la latencia en absoluto ... simplemente deshaga la carga diferida y resuelva los problemas de serialización.


Si realmente está decidido a transportar el gráfico de objetos por la red y conservar la funcionalidad de carga diferida. Eche un vistazo a algún código que produje aquí http://slagd.com/?page_id=6 . Básicamente, crea una sesión falsa en el otro lado del cable y permite que los proxies nhibernate conserven su funcionalidad. No dice que es la manera correcta de hacer las cosas, pero podría darte algunas ideas.