2009-12-30 4 views
6

Ich habe diese hervorragende blog mit dem Titel "NHibernate und die Einheit der Arbeit Muster" betrachtet und habe eine Frage bezüglich der besten Stelle, um UnitOfWork.Start in einem asp zu verwenden. net mvc-Projekt.Die Einheit der Arbeit Muster in einer asp.net mvc-Anwendung

Mein SLN gliedert sich in folgende Projekte: -

MVC project 
Repository 
NHibernateUnitOfWork 

Ich habe eine Schnittstelle: -

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

Ich habe eine konkrete Umsetzung

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

Meine Frage ist, wickle ich alle meine Methoden in alle meine Repositories mit (UnitOfWork.Start()) oder gibt es eine Bette r Ansatz?

Ich benutze nHibernate, asp.net mvc.

Antwort

2

Ich denke Sharp Architecture löst das ziemlich gut. Was sie tun, ist die Arbeitseinheit in einen ASP .Net MVC Action Filter zu setzen. Grundsätzlich können Sie eine Transaktion Aktionsfilter wie

 

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

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

und in der Controller-Klasse legte das Transaktionsattribut auf Ihre Aktion Ergebnis Methode

+9

Ein Nachteil dieses Ansatzes zu beginnen, dass jeder Subzentrale/rentraction ist in einer separaten Einheit der Arbeit – Paco

4

Mit der Arbeitseinheit Muster definieren, müssen Sie nicht jedes Datenzugriffs-Methode setzen in einer separaten Arbeitseinheit. Sie verwenden die Arbeitseinheit um die gesamte Arbeit, die getan werden muss, was in den meisten Fällen in einer Webanwendung eine Webanforderung ist. Die Idee ist, dass eine Anfrage fehlschlagen oder erfolgreich sein kann. Wenn Sie während einer Anforderung 2 Elemente zur Datenbank hinzufügen, sollte beides hinzugefügt werden oder nicht. Nicht nur einer von ihnen. In den meisten Fällen ist der einfachste Weg, um eine Einheit der Arbeit in einem mvc (oder anderes Web) -Anwendung ist in der Beginn und das Ende Anfrage Methoden des 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

Danke, das ist der beste Ansatz. Sie müssen nur aussortieren, ob es eine aktive Transaktion gibt und sie spülen. Vielen Dank –

Verwandte Themen