2009-06-11 15 views

Respuesta

5

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

  1. 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.

  2. 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.

  3. 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.

+0

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

0

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()); 
    } 
+0

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

+0

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

1

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.)

+0

¿Puedes publicar un ejemplo? –

+0

¿Qué tipo de ejemplo? usando la unidad de trabajo o la unidad de trabajo en sí? – Paco

+0

¿Cómo manejaste los diferentes ámbitos de sesión? –

Cuestiones relacionadas