2011-03-26 4 views
3

ASP.NET MVC 2, NHibernate 및 DDD에서 솔루션을 만들고 있습니다. 세미 CQRS 타입 모델을 사용하고 있습니다.ASP.NET MVC 2, Nhibernate 및 여러 계층의 트랜잭션

ASP.NET 컨트롤러는 도메인 개체의 상태를 업데이트하는 서비스 계층에 유효성 검사 메시지를 보냅니다. 도메인 디스패치 "이벤트"가 있으며이 이벤트는 "이벤트 처리기"에 의해 처리됩니다. 이러한 각 이벤트 처리기는 리포지토리 계층에 대한 액세스 권한을 가지며 도메인 개체 상태를 커밋 할 수 있습니다.

이벤트 처리기는 (NHibernate가 아닌) 리포지토리를 사용하여보고 기반 테이블에 레코드를 직접 삽입합니다. 이벤트 처리기는 전자 메일 전송과 같은 데이터베이스 관련 작업이 아닌 작업을 수행 할 수도 있습니다.

이벤트 처리기는 개체의 상태를 변경하여 새로운 이벤트 집합을 만들 수도 있습니다.

단일 asp.net 요청 중에 발생하는 모든 데이터베이스 작업이 단일 트랜잭션 내에 있음을 어떻게 확신 할 수 있습니까? 일부 블로그 (예 : Kevin Williams, Matt WrockDavy Brion)를 읽었으며 시작 및 종료 요청에서 세션 개체를 시작하는 방법에 대한 정보 (여기에도 구조지도를 사용합니다)가 있지만 트랜잭션이 유지되는 방법을 알지 못합니다. 이는 시작 및 끝 요청이 다른 스레드에서 호출 될 수 있다는 사실에 의해 추가되었습니다.

My Repository Class는 매개 변수에서 NHibernate Session을 사용합니다. 하이브리드 범위 (StructureMap)로 ISession을 생성하면 StructrueMap에 의해 전달 된 요청 Isession 매개 변수가 동일하게 유지됩니다.

제 질문에 명확하지 않은 점이 있으면 알려주십시오.

마르

답변

1

당신은 각 웹 요청에 대한 Unit Of Work pattern을 구현 고려할 수 있습니다 감사합니다. 작업 단위 (UOW)는 NHibernate 세션을 작성하고 또한 트랜잭션을 처리합니다. thisthis과 같이 웹에서 찾을 수있는 몇 가지 구현이 있습니다.

+0

@ 감사합니다. 지금 당장 링크를 통해 갈 것입니다. – TheMar

+0

이 두 링크가 좋은 정보를 주었기 때문에 나는이 대답을 받아 들였다. 우물가에서 일하기 시작한다. – TheMar

0

WorldIsRound의 답변 외에도 거래가 작성되고 커미트 된 설명에 명시되지 않았습니다. 귀하의 설명에 따라 서비스 계층의 어딘가에 있어야한다고 가정합니다.
세션을 관리 할 도구가있을 수도 있고 거래가 가능할 수도 있습니다.하지만 제 생각에는 트랜잭션을 명시 적으로 제어하려고합니다.
내 프로젝트에서도 UOW 패턴을 사용하여 Begin_Request 이벤트에서 Session 개체를 만든 다음 해당 개체를 사용하여 필요할 때 트랜잭션을 만듭니다.
다시 말하지만, 제 의견이지만, 거래 개시 및 종료를 완전히 제어해야한다고 생각합니다.
행운을 빕니다

+0

고마워. 요청을 시작할 때 트랜잭션을 생성하고 끝 요청시 커밋합니다. 나는 또한 행동 실행의 시작에 그것을 가지고보고 실행 실행의 끝에 커밋. 이렇게하면 데이터베이스 기반 쿼리 기반 트랜잭션을 시작할 필요가 없습니다. – TheMar