2009-12-30 7 views
6

He estado buscando en este excelente blog titulado "NHibernate y la unidad de patrón de trabajo" y tengo una pregunta sobre el mejor lugar para usar UnitOfWork.Inicie en un asp. proyecto net mvc.El patrón de unidad de trabajo dentro de una aplicación asp.net mvc

Mi SLN se divide en los siguientes proyectos: -

MVC project 
Repository 
NHibernateUnitOfWork 

tengo una interfaz: -

public interface INameRepository 
... 
     IList<Name> GetByOrigin(int OriginId) 
... 

Tengo una aplicación concreta

 public class NameRepository : INameRepository 
    ... 
      public IList<Name> GetByOrigin(int OriginId) { 
       using (UnitOfWork.Start()) { 
        var query = session.Linq<... 
        return query; 
       } 
      } 
    ... 

Mi pregunta es Cómo envuelvo todos mis métodos dentro de todos mis repositorios con el uso (UnitOfWork.Start()) o hay un bette r enfoque?

Estoy usando nHibernate, asp.net mvc.

Respuesta

2

Creo que Sharp Architecture lo resuelve bastante bien. Lo que hacen es colocar la unidad de trabajo dentro de un filtro de acción ASP .Net MVC. Básicamente se puede definir un filtro de Acción de transacciones tales como

 

public class TransactionAttribute : ActionFilterAttribute 
{ 
     public override void OnActionExecuting(ActionExecutingContext filterContext) 
     { 
     UnitOfWork.Start(); 
     } 

     public override void OnActionExecuted(ActionExecutedContext filterContext) 
     { 
     UnitOfWork.Stop(); 
     } 
} 
 

y en su clase controlador puso el atributo de transacción de su método de acción Resultado

+9

Una desventaja de este enfoque es que cada sub-controlador/renderaction está en una unidad de trabajo separada – Paco

4

Con la unidad de patrón de trabajo, no poner todos los métodos DATAACCESS en una unidad de trabajo separada. Utiliza la unidad de trabajo para todo el trabajo que debe realizarse, que en la mayoría de los casos se trata de una solicitud web. La idea es que una solicitud puede fallar o tener éxito. Cuando agrega 2 elementos a la base de datos durante una solicitud, se deben agregar o no. No solo uno de ellos. En la mayoría de los casos, la forma más fácil de iniciar una unidad de trabajo en un MVC (u otra web) de aplicación está en los métodos begin y solicitar final del global.asax

class Global 
{ 
    BeginRequest() 
    { 
     servicelocater.get<unitofwork>().start(); 
    } 

    EndRequest() 
    { 
     var unit = servicelocater.Get<Unitofwork>(); 
     try 
     { 
      unit.commit(); 
     } 
     catch 
     { 
      unit.rollback(); 
      throw; 
     } 
    } 
} 

class Repository<T> 
{ 
    public Repository(INHibernateUnitofwork unitofwork) 
    { 
     this.unitofwork = unitofwork; 
    } 

    public void Add(T entity) 
    { 
     unitofwork.session.save(entity); 
    } 
} 
+0

Gracias, este es el mejor enfoque. Solo necesita resolver si hay una transacción activa y vaciarla. Gracias –

Cuestiones relacionadas