2009-12-30 5 views
6

Ho osservato questo eccellente blog intitolato "NHibernate e l'unità di modello di lavoro" e ho una domanda riguardante il posto migliore per utilizzare UnitOfWork.Start in un asp. progetto net mvc.L'unità di modello di lavoro all'interno di un'applicazione asp.net mvc

mio linfonodo sentinella è suddivisa nei seguenti progetti: -

MVC project 
Repository 
NHibernateUnitOfWork 

Ho un'interfaccia: -

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

Ho una concreta attuazione

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

La mia domanda è faccio a racchiudere tutti i miei metodi in tutti i miei repository usando (UnitOfWork.Start()) o c'è una bette approccio?

Sto usando nHibernate, asp.net mvc.

risposta

2

Penso che Sharp Architecture risolva questo problema abbastanza bene. Quello che fanno è mettere l'unità di lavoro all'interno di un ASP .Net MVC Action Filter. Fondamentalmente si può definire un filtro un'operazione d'azione come

 

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

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

e nella vostra classe controller mettere l'attributo di transazione sul tuo metodo di azione Risultato

+9

Uno svantaggio di questo approccio è che ogni sub-console/renderaction è in un'unità separata di lavoro – Paco

4

Con l'unità di modello di lavoro, non metti ogni metodo DataAccess in una unità separata di lavoro. Usi l'unità di lavoro attorno all'intero lavoro che deve essere svolto, che nella maggior parte dei casi è un'applicazione web richiesta da un web. L'idea è che una richiesta possa fallire o avere successo. Quando aggiungi 2 elementi al database durante una richiesta, deve essere aggiunto o meno. Non solo uno di loro. Nella maggior parte dei casi, il modo più semplice per iniziare un'unità di lavoro in un MVC (o altri web) applicazione è nelle iniziare e richiedere fine metodi 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

Grazie, questo è l'approccio migliore. Devo solo risolvere se c'è una transazione attiva e svuotarla. Grazie –