2010-06-18 47 views
1

我在C#asp.NET MVC2中編寫一些合併功能。我也在使用Linq2SQL。Transactioncope可以通過多次呼叫到不同的服務嗎?

我有一個調用兩個服務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生命週期的推薦做法是將其限制爲一個工作單元。

+0

所以我不應該通過稻田提到的服務/存儲庫之間的上下文? – Andrew 2010-06-23 08:25:35

+1

TransactionScope不知道DataContext,它不需要知道DataContext。甚至在DataContext之前,TransactionScope已經存在。 – 2010-06-23 08:33:45

1

我有我的倉庫兩個構造函數,一個採用一個數據上下文和一個不(然後instatiates它自己)。這意味着我可以根據需要使用共享數據上下文創建存儲庫。

我的服務等級,然後取一個資源庫對象在其構造,這樣我就可以使用實例正在共享數據環境中,如果需要的話倉庫若干服務。

+0

您的更新方法如何工作? – 2010-06-18 10:51:20

+0

@ this。 __curious_geek - 我傾向於只使用這種技術進行跨越系統不同區域的更新(如上所述)。我打電話給每個服務的更新,然後在其中一個服務上點擊「保存」,這些服務會在我的數據上下文中提交更改。 – Paddy 2010-06-18 11:00:05