ventajas tipos sirve repositorios repositorio que proyecto permiten para los institucional importancia digitales desventajas crear como vb.net nhibernate repository

vb.net - tipos - La mejor forma de utilizar NHibernate con el modelo de repositorio



tipos de repositorios (1)

Tengo una clase de repositorio que define algunos métodos básicos de Obtener / Guardar / Eliminar. Dentro de estos, utilizo NHibernate para hacer el trabajo en mis entidades comerciales. Por ejemplo:

Public Class SecurityRepositoryNHibImpl : Implements ISecurityRepository Public Function GetUser(ByVal UUID As System.Guid) As Entities.User Implements ISecurityRepository.GetUser Dim eUser As Entities.User Using session As ISession = NHibernateHelper.OpenSession() eUser = session.Get(Of Entities.User)(UUID) End Using Return eUser End Function End Class

Sin embargo, en mi clase de usuario tengo algunas propiedades y colecciones de otros objetos que, idealmente, me gustaría cargar con pereza. Pero, por supuesto, la ISession se crea y se elimina dentro del repositorio, lo que supongo que es el motivo. Fuera de eso, cuando intento acceder a esas propiedades obtengo el error "No se pudo inicializar el proxy - sin sesión".

¿Mi única opción es desactivar la carga diferida cuando utilizo repositorios? ¿O es posible (o simplemente tonto) lograr que la sesión alcance el alcance en la capa de negocios?

Me gusta el modelo de repositorio, y NHibernate está creciendo en mí (después de mucha frustración inicial tratando de hacerlo funcionar), entonces, ¿cuál es la mejor forma que han encontrado los gurús de usarlos juntos?

Soy bastante nuevo en NHibernate y en los modelos de repositorio en general (¡en el trabajo todavía utilizamos principalmente VB6!), Así que perdona lo que puede ser una pregunta tonta. Gracias.

@mookid: Gracias amigo, eso es realmente útil, pero podría dejarlo abierto un poco más. Es el back-end de un servicio web de WCF, y todas las funciones serán por contexto de llamada, por lo que una vida de sesión por llamada será buena. Simplemente no estoy seguro de cómo hacer que funcione tal cosa en la capa de negocios, idealmente no quiero que los objetos de negocio tengan que interactuar directamente con ninguna clase de NHibernate. Supongo que algún tipo de envoltorio para la sesión de NHibernate al menos lo abstrae ... Hmm, al menos me has puesto en el camino correcto.

Parece que la palabra clave aquí es "Unidad de trabajo", para la cual existe una tonelada de recursos en la web en relación con NHibernate. En particular, busque la implementación de Ayende en Rhino Commons, y su elenco web de App Architecture (n. ° 9 en Hibernating Rhinos) , muy informativo. Inicialmente estaba confundido porque pensé que poner una "Unidad de trabajo" en la capa de negocios estaba mezclando preocupaciones, pero pronto me corrigieron.


Crear su ISession y disponerla explícitamente en sus repositorios de esa manera está bien para proyectos pequeños y muy simples, pero, como ha descubierto, se queda corto cuando comienza a querer usar algunas de las geniales funciones que admite NHibernate.

Probablemente debas dejar que el estilo de vida de la sesión sea controlado por algo que esté fuera de tus repositorios; por ejemplo, si estás haciendo aplicaciones web ASP.NET, tal vez quieras guardar la sesión en la solicitud actual ( HttpContext.Current.Items si recuerdo correctamente) ) durante la duración de la solicitud web, y luego confirmar y eliminar al final de la solicitud (o revertir si se produce una excepción).

No sé cuál es la mejor manera de controlar el estilo de vida de su sesión en las aplicaciones ASP.NET, pero debe haber alguna forma de que se invoque el código al principio y al final de cada solicitud. En ASP.NET MVC se puede lograr fácilmente derivando todos sus controladores desde un controlador base que ha OnActionExecuting sus métodos OnActionExecuting y OnActionExecuted .