¿Cuándo escribiría una implementación de UoW además de lo que ya proporciona NHibernate? ¿Algún ejemplo del mundo real?¿Por qué usaría el patrón Unidad de trabajo en la parte superior de una sesión de NHibernate?
Respuesta
la unidad de trabajo que usted está describiendo ya está proporcionada por NHibernate lo que no hay razón para hacer una unidad de tales trabajo.
Lo que tenemos en nuestro Servicio WCF es una unidad de trabajo de nivel superior que contiene información importante en nuestra aplicación para la unidad de trabajo actual. Esto incluye abstraer NHibernate ISession por nosotros. Cuando lo descompone, tiene un código que encaja en tres categorías
Código que debe tratar con una unidad de trabajo. No importa quién respalde la unidad de trabajo. Podría ser NHibernate, iBatis o un ORM personalizado. Todo lo que el código necesita hacer es Cargar, Revertir, Guardar, etc. No le importa ni debería preocuparse por el mecanismo utilizado para hacerlo.
Código que necesita tratar con una ISession directamente porque está haciendo NHibernate cosas específicas. Usualmente esto tiene que ver con consultas complejas que necesitan ser creadas.
No necesita saber que se está ejecutando en una unidad de trabajo o acceder a la ISession. Podemos ignorar esto por completo como parte de esta discusión.
Mientras código en 1. sólo podría trabajar en contra de un ISession nuestra preferencia es tratar de cosas abstractas de distancia en el código que nosotros no controlamos directamente o que podrían cambiar. Esto tiene valor por dos razones.
Cuando comenzamos no estábamos 100% vendidos en NHibernate. Estábamos considerando iBatis o algo personalizado. Obviamente, esto ya no es un problema.
Todo el equipo no es experto en NHibernate ni queremos que lo sea. La mayoría de las personas escriben códigos que encajan en la categoría 1. Todo lo que saben es nuestra Unidad de trabajo. Cuando el código en la categoría 2. tiene que ser escrito, lo escriben las personas del equipo que entienden bien a NHibernate.
Así que para cerrar yo diría que el tipo de unidad de trabajo que está hablando no es necesario que sugeriría que una unidad de nivel superior de trabajo puede proporcionar un gran valor.
Siempre que configure correctamente todas sus asignaciones (es decir, cascadas), no tiene que hacer nada especial y ISession
funcionará bien. Sin embargo, si está escribiendo una aplicación de 3 niveles, deberá secuenciar manualmente las operaciones de la base de datos que desea que se realicen en una sola transacción. "Implementación de referencia" de Fowler en "Patrones de Arquitectura de aplicaciones de empresa" puede ser un buen punto de partida:
class UnitOfWork...
public void registerNew(DomainObject obj) {
Assert.notNull("id not null", obj.getId());
Assert.isTrue("object not dirty", !dirtyObjects.contains(obj));
Assert.isTrue("object not removed", !removedObjects.contains(obj));
Assert.isTrue("object not already registered new", !newObjects.contains(obj));
newObjects.add(obj);
}
public void registerDirty(DomainObject obj) {
Assert.notNull("id not null", obj.getId());
Assert.isTrue("object not removed", !removedObjects.contains(obj));
if (!dirtyObjects.contains(obj) && !newObjects.contains(obj)) {
dirtyObjects.add(obj);
}
}
public void registerRemoved(DomainObject obj) {
Assert.notNull("id not null", obj.getId());
if (newObjects.remove(obj)) return;
dirtyObjects.remove(obj);
if (!removedObjects.contains(obj)) {
removedObjects.add(obj);
}
}
public void registerClean(DomainObject obj) {
Assert.notNull("id not null", obj.getId());
}
Es una aplicación de 3 niveles. Sin embargo, queremos que cada solicitud de usuario sea atómica, por lo tanto, 1 solicitud de usuario = 1 transacción DB. Procesaré la solicitud del usuario, modificaré los objetos del dominio y luego le pediré a NHibernate que conserve mi raíz agregada. – ng5000
Esta es una abstracción sobre un mapa de identidad. Es útil cuando crea un mapa de datos manual como se describe en el POEA de Fowler, pero con NHibernate, porque el mapa de identidad está integrado en la ISession. – Paco
Mi unidad básica de la interfaz de trabajo contiene los siguientes métodos - Inicializar - Observar - Rollback - IDisposable.Dispose
lo uso tanto para la sesión y gestión de transacciones. Es útil porque no tengo que escribir ese código una y otra vez para diferentes ámbitos de sesión.(unidad de trabajo por solicitud, por serie de solicitudes, por hilo, etc.)
¿Puedes publicar un ejemplo? –
¿Qué tipo de ejemplo? usando la unidad de trabajo o la unidad de trabajo en sí? – Paco
¿Cómo manejaste los diferentes ámbitos de sesión? –
- 1. Uso del patrón de diseño de la Unidad de trabajo/Sesiones NHibernate en un MVVM WPF
- 2. Aplicación del patrón Unidad de trabajo
- 3. Unidad de trabajo y el patrón de repositorio
- 4. Implementación de la unidad de trabajo
- 5. Unidad de trabajo de diseño del patrón
- 6. El patrón de unidad de trabajo dentro de una aplicación asp.net mvc
- 7. Formas de implementar la Unidad de trabajo en ASP.NET MVC
- 8. ¿La aplicación ObjectContext de Entity Framework es correcta para el patrón de unidad de trabajo?
- 9. unidad que prueba una unidad de trabajo
- 10. Unidad de trabajo/administradores de repositorios para NHibernate?
- 11. ¿Cuál es la intención del método de reversión en el patrón de unidad de trabajo?
- 12. Mejores prácticas para el inicio de sesión en la parte superior de los niveles de registro
- 13. ¿Qué es la sesión de NHibernate exactamente?
- 14. Patrón de repositorio con NHibernate?
- 15. Enfrente de "siempre en la parte superior"
- 16. ¿Por qué alguna vez usaría el objeto de almacenamiento ViewState de asp.net sobre el objeto de almacenamiento de sesión?
- 17. ¿Qué estructura de php usar en la parte superior de la base de código de spaghetti?
- 18. Dibujo en la parte superior de una imagen en Javascript
- 19. ¿Por qué alguien usaría C en lugar de C++?
- 20. posicionar un div en la parte superior de una imagen
- 21. ¿Cuál es el significado del concepto de "unidad de trabajo" en NHibernate y otros ORM?
- 22. Contexto actual de sesión de NHibernate Problema
- 23. ServiceStack NHibernate Sesión por solicitud
- 24. Cuándo usaría el patrón de diseño de mediador
- 25. ¿Por qué alguien usaría Collections.emptyList en java?
- 26. ¿Por qué Google usaría una etiqueta de fuente?
- 27. Contar el número de consultas ejecutadas por NHibernate en una prueba de unidad
- 28. ¿Por qué usaría la base de datos Oracle?
- 29. Mantener diálogos en la parte superior de la ventana, pero no en la parte superior de todo
- 30. ¿Por qué git-bisect debe ejecutarse desde el directorio de nivel superior del árbol de trabajo?
ShaneC, tengo una pregunta similar, y parece que ha creado una Unidad de trabajo que se adapta mejor a mis necesidades que la mía. ¿Puedes echar un vistazo a mi pregunta y ofrecer tus $ 0.02? http://stackoverflow.com/questions/2604762/using-unit-of-work-design-pattern-nhibernate-sessions-in-an-mvvm-wpf – Echiban