2009-12-30 3 views
6

나는이 우수 제품 blog "NHibernate 및 작업 단위 (Unit of Work Pattern)"를보고 ASP에서 UnitOfWork.Start를 사용하기에 가장 좋은 장소와 관련하여 질문이 있습니다. net mvc 프로젝트.asp.net mvc 응용 프로그램 내의 작업 단위 패턴

은 내 SLN은 다음 프로젝트로 분류됩니다 : - :

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

내가

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

내 질문은 구체적인 구현을이 -이

MVC project 
Repository 
NHibernateUnitOfWork 

내가 인터페이스를 가지고 (UnitOfWork.Start())를 사용하여 모든 저장소 내에서 모든 메서드를 래핑합니까? 아니면 bette가 있습니까? r 접근?

저는 nHibernate, asp.net mvc를 사용하고 있습니다.

답변

2

Sharp Architecture는 이것을 아주 잘 해결한다고 생각합니다. 그들이하는 일은 ASP 내부에 작업 단위를 두는 것입니다. Net MVC Action Filter. 기본적으로 당신이 작업 패턴의 단위로 액션 결과 방법

+9

이 방법의 단점의 시작과 끝 요청 방법에서 것은 모든 subcontroller이다/렌더링은 별도의 작업 단위에 있습니다. – Paco

4

에서 트랜잭션 속성을 넣어 같은

 

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

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

같이 컨트롤러 클래스에서 트랜잭션 작업 필터를 정의 할 수 있습니다, 당신은 모든 DATAACCESS 방법을 넣지 마십시오 별도의 작업 단위로 대부분의 경우 웹 어플리케이션에서 웹 요청에서 수행해야하는 전체 작업에 대해 작업 단위를 사용합니다. 아이디어는 요청이 실패하거나 성공할 수 있다는 것입니다. 한 요청 동안 데이터베이스에 2 개의 항목을 추가 할 때 두 항목을 모두 추가하거나 제거해야합니다. 그 중 하나가 아닙니다. 대부분의 경우, 가장 쉬운 방법은 MVC에서 작업 단위를 시작 (또는 다른 웹) 응용 프로그램의 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

감사합니다.이 방법이 최선의 방법입니다. 활성 트랜잭션이 있고이를 플러시하는 경우에만 정렬해야합니다. 감사 –

관련 문제