2009-12-30 12 views
6

Patrzyłem na to doskonałe blog zatytułowany "NHibernate i Unit of Work Pattern" i mieć pytanie dotyczące najlepszego miejsca do korzystania z UnitOfWork.Start w asp. projekt netto mvc.Wzorzec pracy w aplikacji asp.net mvc

Moje SLN dzieli się na następujące projekty: -

MVC project 
Repository 
NHibernateUnitOfWork 

Mam interfejs: -

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

mam konkretnej implementacji

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

moje pytanie brzmi: czy zawijam wszystkie moje metody do wszystkich moich repozytoriów za pomocą (UnitOfWork.Start()) lub czy istnieje bette r podejście?

Używam nHibernate, asp.net mvc.

Odpowiedz

2

Myślę, że Sharp Architecture rozwiązuje to całkiem dobrze. To, co robią, umieszcza jednostkę pracy w filtrze akcji ASP .Net MVC. Zasadniczo można zdefiniować filtr działania transakcja takich jak

 

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

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

aw swojej klasie kontrolera umieścić atrybut transakcja na działania Wynik Metoda

+9

Wadą tego podejścia jest to, że każdy subcontroller/renderaction jest w oddzielnej jednostce pracy – Paco

4

z jednostką wzór pracy, nie umieścić każdą metodę DataAccess w oddzielnej jednostce pracy. Używasz jednostki pracy wokół całej pracy, która musi zostać wykonana, co w większości przypadków jest aplikacją webową. Chodzi o to, że prośba może się nie udać lub osiągnąć sukces. Gdy dodasz 2 pozycje do bazy danych podczas jednego żądania, oba powinny zostać dodane lub nie. Nie tylko jeden z nich. W większości przypadków, najprostszym sposobem, aby rozpocząć jednostkę pracy w MVC (lub innych stron internetowych) aplikacja jest na żądanie rozpoczęcia i końca metod 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

Dzięki, to jest najlepsze podejście. Po prostu trzeba rozwiązać, jeśli jest aktywna transakcja i opróżnij ją. Dzięki –

Powiązane problemy