3

こんにちは、アプリのいくつかの場所で TransactionScope を使用しています。お気に入り:

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

すべての TransactionScopes を 1 か所で無効にできるようにしたいと考えています。

使用するかどうかを定義できる MyTransactionScope クラスのようなものを想像しています。

それを達成する方法のヒントを教えてもらえますか?

ありがとうございました。

4

2 に答える 2

6

私はこれをやった。TransactionScope封印されているため継承できません。代わりに、クラスをクラス内に含めますMyTransactionScopeIDisposableまた、コンストラクトを使用して呼び出すことができるように実装します。そして公開.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();
    }
}
于 2012-08-09T18:44:47.530 に答える
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();
}
于 2012-08-09T18:29:53.120 に答える