2010-06-18 2 views
1

C# asp.NET MVC2에서 병합 기능을 일부 작성했습니다. 나는 또한 Linq2SQL을 사용하고있다.transactionscope는 여러 서비스를 여러 번 호출해도 작동합니까?

MessageService와 UserService라는 두 개의 서비스를 호출하는 코드 블록이 있습니다. 이들은 둘 다 적절한 저장소를 호출하고 db에 대한 수정을합니다. 각 저장소는 저장소의 자체 인스턴스라고 선언하므로 다음 코드를 DTC으로 에스컬레이션 할 것입니다. 이 코드는 AccountService에서 호출됩니다.이 코드는이 수준에서 작동합니까? 또한 모든 저장소의 맨 위에있는 DataContext를 선언하는 것이 좋지 않습니까? 아니면 어떻게 든 객체를 전달해야합니까? 미리 감사드립니다.

//Run the merge 
try 
{ 
    using (TransactionScope scope = new TransactionScope()) 
    { 
     // Update Messages to be owned by primary user 
     if (!_MessageService.UpdateCreatedById(MergeUser.UserID, CoreUser.UserID)) 
     { 
      return false; 
     } 

     // Update Comments to be owned by primary user 
     foreach (var curComment in _MessageService.GetUserComments(MergeUser.UserID)) 
     { 
      curComment.CreatedBy = CoreUser.UserID; 
     } 

     _MessageService.Save(); 

     // Update Logins to be owned by primary user 
     foreach (var CurLogin in _UserService.GetLogins(MergeUser.UserID)) 
     { 
      CurLogin.UserID = CoreUser.UserID; 
     } 

     _UserService.Save(); 

     scope.Complete(); 
    } 

    return true; 
} 
catch (Exception ex) 
{ 
    _ErrorStack.Add(ex.Message); 
    ErrorService.AddError(new ErrorModel("Portal", "WidgetRepository", ErrorHelper.ErrorTypes.Critical, ex)); 
    return false; 
} 

답변

1

예, 가능합니다. TransactionScope은 분산 트랜잭션 코디네이터를 활용하므로 데이터베이스 수준 이상의 트랜잭션을 호스팅 할 수 있습니다.

DataContext 수명주기에 권장되는 방법은 작업 단위 (unit-of-work)로 제한하는 것입니다.

+0

그래서 paddy가 언급 한 서비스/저장소 간의 컨텍스트를 전달해서는 안됩니까? – Andrew

+1

TransactionScope는 DataContext를 알지 못하므로 DataContext를 알 필요가 없습니다. TransactionScope는 DataContext보다 앞에 있습니다. –

1

내 저장소에 두 개의 생성자가 있습니다. 하나는 데이터 컨텍스트를 취하고 다른 하나는 생성하지 않습니다. 즉, 필요에 따라 공유 데이터 컨텍스트를 사용하여 리포지토리를 만들 수 있습니다.

그래서 내 서비스 클래스는 생성자에서 저장소 개체를 가져 오므로 필요한 경우 데이터 컨텍스트를 공유하는 저장소를 사용하여 여러 서비스를 인스턴스화 할 수 있습니다.

+0

업데이트 방법은 어떻게 작동합니까? –

+0

@this. __curious_geek - (위와 같이) 시스템의 다른 영역에 적용되는 업데이트에만이 기법을 사용하는 경향이 있습니다. 각 서비스에 대한 업데이트를 호출 한 다음 내 데이터 컨텍스트에서 변경 사항을 제출할 '저장'중 하나에 저장합니다. – Paddy