2010-05-07 45 views
3

我總是使用以下格式來使用transactionscope。不使用TransactionScope的「使用」語句

 
using(TransactionScope scope = new TransactionScope()){ 
    .... 
} 

有時我想包裝的TransactionScope的新的一類,例如的DbContext類,我想使用的語句像

 
dbContext.Begin(); 
... 
dbContext.Submit(); 

似乎transactioncope類需要使用「使用」聲明做處理,我想知道是否有反正不使用「使用」。

回答

10

您可以設計DbContext類,如下所示:

public sealed class DbContext : IDisposable 
{ 
    private bool disposed; 
    private TransactionScope scope; 

    public void Begin() 
    { 
     if (this.disposed) throw new ObjectDisposedException(); 
     this.scope = new TransactionScope(); 
    } 

    void Submit() 
    { 
     if (this.disposed) throw new ObjectDisposedException(); 
     if (this.scope == null) throw new InvalidOperationException(); 
     this.scope.Complete(); 
    } 

    public void Dispose() 
    { 
     if (this.scope != null) 
     { 
      this.scope.Dispose(); 
      this.scope = null; 
     } 
     this.disposed = true; 
    } 
} 

,您可以按如下方式使用它:

using (var context = new DbContext()) 
{ 
    context.Begin(); 

    // Operations. 

    context.Submit(); 
} 
15
using (var scope = new TransactionScope()) 
{ 
    … 
} 

在功能上等同於:

var scope = new TransactionScope(); 
try 
{ 
    … 
} 
finally 
{ 
    scope?.Dispose(); 
} 

(即你可以只使用using語句實現了IDisposable接口類型)

2

可以使用try..finally和請自行處理,但不像使用表格那麼清晰。