Open Session In View - IIS7 - Spring .Net

Holas a todos

Volviendo a escribir un artículo que, a recomendación de un amigo, podría ayudar a muchos con este problema que siempre ocurre al utilizar Spring .Net + Open Session in View design pattern + IIS7.

Vamos por lo primero, el patrón Open Session in View, según Hibernate este patrón consiste en mantener la sesión de Hibernate(aunque en el caso de .Net es NHibernate) abierta hasta que se realice la renderización de la vista.

Ahora, por qué existe este patrón? La respuesta es simple, muchos que hemos usado Nhibernate podemos notar que cuando tenemos un objeto que tiene relación one-to-many (o cualquier otro tipo de relación) con otro objeto, y queremos acceder a este último al momento de estar en el code-behind, nos aparece el clásico error "LazyInitializationException".

El patrón Open Session In View, tal como se mencionó anteriormente, permite solucionar este problema al mantener la sesión abierta hasta la renderización de la vista.

Ahora, la historia, tal como mencioné en la conferencia de Spring Live Perú 2009, me encuentro en un proyecto de .Net (framework 3.5) en el cual estoy cumpliendo cierto papel de arquitecto. En este proyecto estamos utilizando Spring .Net, NHibernate y AjaxToolkit. Entonces un día nació la necesidad de usar el patrón Open Session in View, todo bien en el sitio donde desarrollábamos, pero al momento de probarlo en un IIS7 ocurría un problema muy extraño, aún seguía saliendo el error de "LazyInitializationException". Lo cual fue muy extraño, pues si estaba solucionado en nuestras laptops cuando probábamos, entonces qué razón había para que no funcione en el servidor?

Entonces, como todo problema, se intentó buscar la solución a esto pero no había mucha información del problema, hasta que pude dar con el problema en este sitio
donde nos indicaban cambiar el módulo de Open Session In View de system.web/httpModules a system.webserver/modules. Es decir, tenemos que pasar esta línea de código:

<httpModules>
<add name="OpenSessionInView" type="Spring.Data.NHibernate.Support.OpenSessionInViewModule, Spring.Data.NHibernate20"/>
</httpModules>

a la siguiente posición:

<modules>
<add name="OpenSessionInView" type="Spring.Data.NHibernate.Support.OpenSessionInViewModule, Spring.Data.NHibernate20"/>
</modules>

Pero hay que tener mucho cuidado con esto, porque el sitio menciona el mover de httpModules a modules. Pero no debemos cortar y pegarlo, porque esto ocasionaría que funcione en el servidor IIS7, pero no en nuestras máquinas de desarrollo. Por lo tanto deberían tenerlo replicado tanto en los modules como en los httpModules.

Y listo, con esto podrán usar el patrón Open Session In View para NHibernate integrado con Spring .Net, y funcionará tanto para IIS7, como para el IIS6.

Espero les pueda servir esto a muchos para solucionar problemas tan particulares que se tienen con el IIS7.

Enjoyt it

Shinji

7 comentarios:

Jose Luis Manrique dijo...

Por lo que recordaba en Java la nota con el OpenSessionInView era crear una nueva sessión de BD para que esta sea la que acceda a los atributos de un bean no que te la mantuviera, seria cuestion de chekarlo.

Dac dijo...

El patrón osiv hace que se abra una sesión x request, es decir se reserve una de las conexiones del pool x cada request del usuario. Las conexiones a la BD ya están hechas, solo coge una del pool. Al menos es así en java

Christian Eduardo Palomares Peralta (ShinjiDev) dijo...

Exacto Diego

Tal como se menciona en el post, el patrón OSIV (Open Session In View) permite mantener viva esta sesión que mencionas hasta la renderización de la vista.

Por lo tanto, si uno tiene una entidad que tiene una lista de otras entidades, que se encuentran, según el mapeo, en lazy = false, con este patrón, podrá acceder a esta lista sin problema alguno.

Por cualquier cosa revisen el link donde explican el patrón OSIV en la página de Hibernate.

O sino tb pueden entrar a este link:

http://jnassef.blogspot.com/2007/05/open-session-in-view.html

Gracias por los comentarios =)

Javier Cabanillas Rodríguez dijo...

Tu y tus fumadas, usa una arquitectura mas sencilla y deja de fumar tanto jaja.

Christian Eduardo Palomares Peralta (ShinjiDev) dijo...

jajajaja XD.

Qué otro ORM puedes usar para .Net? o.o

Es arquitectura sencilla si lees y aprendes sobre esta tecnología :D

Es como toda tecnología, tiene su curva de aprendizaje =).

Gustavo dijo...

Es exactamente el problema que tenia y no encontraba solucion por ningun lado.
Agradezco muchisimo este post!

Saludos.
Gustavo

Christian Eduardo Palomares Peralta (ShinjiDev) dijo...

Me alegro que esté sirviendo esta publicación, pues yo mismo sé que es difícil encontrar una solución para esto. En mi caso solo encontré ese link que publiqué.

Cualquier duda o problema no duden en hacerlo =)