3

私のプロジェクトが.net petshopのようなものだとします。BLL、DAL、および SQLHelper があります。

通常、Web レイヤーで BLL 関数を呼び出し、BLL 関数が DAL 関数を呼び出し、最後に DAL が sqlhelper を呼び出します。

しかし、場合によっては、トランザクションを必要とします。

例えば:

ウェブ層:

いくつかの BLL 関数を呼び出す必要があります。以下のようにコードします。

var m = BLLFunction_1();

var n=  BLLFunction_2();

if (m+n<100)
{
// need rollback here
}
else
{
BLLFunction_3();
// commit here 
}

そのため、Web レイヤーでトランザクション オブジェクトを使用して BLL 関数に渡し、BLL レイヤーで DAL レイヤーに渡し、最後に SQLHelper に渡す必要があります。

それは少し醜いです。

この状況に対するエレガントな方法は何だろうか。

4

2 に答える 2

2

ADO.NET でトランザクションを探していると仮定しています。

基本的に、「アクション」を TransactionScope にラップする必要があります。

    try
    {
        using(TransactionScope ts = new TransactionScope())
        {
            //perform SQL
            using(SqlHelper sh = new SqlHelper())
            {
                //do stuff
            }

            //call new DAL function

            //call other DAL function

            ts.Complete();            
        }
    }
    catch(Exception ex)
    {
        throw ex;
    }
于 2013-08-08T12:55:32.817 に答える
0

こんにちは、TransactionScopeOption Required を使用して BLL 関数でトランザクションを作成します

public void BLLFunction_1()
   {     
       using(TransactionScope ts = new TransactionScope(TransactionScopeOption.Required))
       {
           //do ur stuff here

           ts.Complete();
       }
   }

    public void BLLFunction_2()
   {     
       using(TransactionScope ts = new TransactionScope(TransactionScopeOption.Required))
       {
           //do ur stuff here

           ts.Complete();
       }
   }

With TransactionScopeOption Required : スコープでトランザクションが必要です。アンビエント トランザクションが既に存在する場合は、それを使用します。それ以外の場合は、スコープに入る前に新しいトランザクションを作成します。これがデフォルト値です。したがって、ここで BLLFunction_2 は、新規作成する代わりに BLLFunction_1 のトランザクションを使用します。

于 2013-08-08T13:05:39.790 に答える