如何为TransactionScope编写包装器

时间:2012-08-09 18:19:34

标签: c# design-patterns

您好我在我的应用中的几个地方使用TransactionScope。像:

using (var scope = new TransactionScope())
{
        ToDo1();
        ToDo2();
        scope.Complete();
}

我希望有可能在一个地方禁用我的所有TransactionScope。

我想象MyTransactionScope类,我可以定义是否要使用它。

你能给我一个如何实现它的提示吗?

谢谢。

2 个答案:

答案 0 :(得分:5)

我做到了这一点。您不能继承TransactionScope因为它是密封的。相反,您在MyTransactionScope类中包含该类。同时实现IDisposable,以便您可以使用construct来调用它。并公开.Complete()和其他相关方法。这些方法将在内部调用内部包含的对象。

public sealed class MyTransactionScope : IDisposable
{
    TransactionScope _transactionScope = null;

    #region Overloaded Constructors
    public MyTransactionScope()
    {
        _transactionScope = new TransactionScope();
    }

    public MyTransactionScope(Transaction transactionToUse)
    {
        _transactionScope = new TransactionScope(transactionToUse);
    }
    #endregion

    public void Complete()
    {
        _transactionScope.Complete();
    }

    public void Dispose()
    {
        _transactionScope.Dispose();
    }
}

答案 1 :(得分:2)

如果您的意思是我的意思,那么您应该可以使用Suppress交易范围选项:

using (var scope = new TransactionScope())
{
        using(TransactionScope scope2 = new TransactionScope(TransactionScopeOption.Suppress)) {
           ToDo1();
           scope2.Complete();
        }

        // If ToDo2 throws an exception and the transaction is rolled back,
        // ToDo1 will still be committed since it did not participate in the
        // original (ambient) transaction.
        ToDo2();       
        scope.Complete();
}
相关问题