¿Por qué debería utilizar la Unidad de patrón de trabajo en la parte superior de una sesión de NHibernate?

StackOverflow https://stackoverflow.com/questions/980584

  •  13-09-2019
  •  | 
  •  

Pregunta

Cuando iba a escribir una aplicación UoW en la parte superior de lo que ya es proporcionada por NHibernate? Cualquier ejemplos del mundo real?

¿Fue útil?

Solución

La unidad de trabajo que usted está describiendo ya está proporcionada por NHibernate lo que no hay razón para hacer una unidad de trabajo tales.

Lo que tenemos en nuestro servicio WCF es una unidad mayor nivel de trabajo que contiene información importante en nuestra solicitud de la unidad de trabajo actual. Esto incluye la abstracción NHibernate ISession para nosotros. Cuando se descomponen tiene código que se ajusta en tres categorías

  1. El código que tiene que hacer frente a una unidad de trabajo. No importa que apoya la unidad de trabajo. Podría ser NHibernate, iBatis o un ORM personalizado. Todo el código tiene que hacer es cargar, Rollback, Guardar, etc. No ni debe preocuparse por el mecanismo utilizado para hacerlo.

  2. El código que tiene que hacer frente a una ISession directamente porque está haciendo cosas específicas NHibernate. Por lo general, esto tiene que ver con consultas complejas que necesitan ser creados.

  3. no necesita saber que se está ejecutando en una unidad de trabajo o acceder al ISession. Podemos ignorar por completo esto 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 empezamos no estábamos 100% vendido en NHibernate. Estábamos teniendo en cuenta iBatis o algo personalizado. Obviamente, esto ya no es un problema.

  • Todo el equipo no son expertos en NHibernate ni queremos que sean. En su mayor parte personas escriben código que encaja en la categoría 1. y todo lo que saben acerca es nuestra unidad de trabajo. Cuando el código de categoría 2. tiene para que se escriba el fichero es escrito por la gente en el equipo que entender bien 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 alto nivel de trabajo puede proporcionar una gran cantidad de valor.

Otros consejos

Mi unidad básica de la interfaz de trabajo contiene los siguientes métodos - Inicializar - Comprometerse - Retroceder - IDisposable.Dispose

Yo lo uso tanto para la sesión y gestión de transacciones. Es útil porque yo no tengo que escribir ese código una y otra vez para diferentes ámbitos de la sesión. (Unidad de trabajo según la petición, por serie de peticiones, por hilo, etc)

Siempre que configura todas sus asignaciones correctamente (es decir, cascadas), usted no tiene que hacer nada especial y ISession no tendrán ningún problema. Sin embargo, si usted está escribiendo una aplicación de 3 niveles, que tendrá que manualmente las operaciones de bases de datos de secuencia 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());
   }
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top