2011-09-24 5 views
3

모든 사용자 데이터 액세스를 수행하는 사용자 저장소가 있습니다. 또한 저의 저장소에 대한 연결과 트랜잭션을 관리하는 작업 단위 클래스도 있습니다. 저장소에서 오류가 발생하면 작업 단위 클래스에서 트랜잭션을 효과적으로 롤백하는 방법은 무엇입니까?작업 단위 (Unit of Work) 및 저장소 패턴을 사용하여 트랜잭션을 롤백하는 방법은 무엇입니까?

내 UserRepository에 메서드를 만듭니다. DataAccess에 Dapper를 사용하고 있습니다.

try 
{ 
    this.Connection.Execute("User_Create", parameters, this.Transaction, 
     commandType: CommandType.StoredProcedure); 
} 
catch (Exception) 
{ 
    //Need to tell my unit of work to rollback the transaction.     
} 

작업 단위 생성자에서 작성한 연결 및 트랜잭션을 모두 내 저장소로 전달합니다. 아래는 제 작업 단위 클래스의 속성입니다.

public UserRepository UserRepository 
{ 
    get 
    { 
     if (this._userRepository == null) 
      this._userRepository = 
       new UserRepository(this._connection, this._transaction); 
     return this._userRepository; 
    } 
} 

나는 최선의 접근 방법을 찾고 싶습니다.

* 업데이트 * 작업 단위 패턴에 대한 더 많은 연구를 한 후에 나는 내 예제에서 완전히 잘못 사용하고 있다고 생각합니다.

답변

5

Dapper 지원 TransactionScopeComplete()을 호출하지 않으면 트랜잭션을 완료하기 위해 Complete() 메서드를 제공하고 트랜잭션을 중단합니다.

using (TransactionScope scope = new TransactionScope()) 
{ 
    //open connection, do your thing 
    scope.Complete(); 
} 
+1

.net 프레임 워크의 TransactionScope 인 경우 올바른 해결책이 아닙니다. 더 가볍기 때문에 SqlTransaction은 올바른 방법입니다. TransactionScope를 사용하는 강력한 이유가 없다면 (필자는 보지 못한다.) 나는 그 조언을 사용하지 않을 것이다. – thekip

+1

@thekip : "올바른"또는 "잘못된"해결책은 없다. 당신에게 경량은 당신의 필요에 맞는 솔루션이라는 것을 의미 할 수도 있습니다. 그러나 ['TransactionScope'] (http://msdn.microsoft.com/en-us/library/system.transactions.transactionscope.aspx)는 다중 객체 문제를 적절한 분리로 해결합니다. 요즘에는 문제가됩니다 (그렇지 않으면 ['SqlTransaction'] (http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqltransaction.aspx))를 레이어 및 트랜잭션과 관련된 객체, 매우 깨끗하지는 않음). – casperOne

+1

트랜잭션을 레이어를 통해 전달해야하는 것은 설계상의 결함입니다. 작업 단위 (UOW)를 올바르게 구현하면이 작업 단위 (UOW)를 실행할 때만 트랜잭션을 시작하면됩니다. 작업 단위 (UOW)의 실행과 문제가있는 곳에서 실행될 모든 조작을 추가하는 문제를 혼합하십시오. – thekip

관련 문제