1

私は過去にデリゲートを使用したことがあるので、デリゲートの使用と利点に精通しています。私もたくさんの読書/研究をしました、しかし私はこれに頭を包み込もうとしていて、どこにも行きません。デリゲート(私は信じています)を使用してコードをカプセル化するか、メソッド内でデリゲートを使用して外部コードを呼び出したいと思います。

トランザクションでエンティティフレームワークの更新をラップするために、20の異なる場所で同じコードを使用しています。コードを1か所にまとめたい。ただし、途中で毎回変わる部分があるので、メソッドだけではできません。私はこれを最もよく行う方法についていくつかのアイデア/説明を探しています(.net 3.5、ms sql2010)。--thnx

コードサンプル:

    void AddItem(string objDetails)
    {
        // setup method specific entity objects
        SomeObject obj = new SomeObject { Details = objDetails };


        //////// Begin transaction code that I would like to encapsulate  ///////
        bool success = false;

        using (Entities data = new Entities())
        {
            for (int i = 0; i < s.BaseSettings.CommandRetries; i++)
            {
                using (TransactionScope transaction = new TransactionScope())
                {
                    try
                    {
                        //////////////////////////////////////////////////////////////
            ///////// BEGIN Code that I would like to change / call different each time ////////

            data.AddToSOMEOBJECTs(obj);

            //////////////// END //////////////////////////////////


            //// RETURN TO ENCAPSULATED CODE ////

                        data.SaveChanges(false);
                        transaction.Complete();
                        success = true;
                        break;
                    }
                    catch (Exception ex)
                    {
                        if (ex.GetType() != typeof(UpdateException))
                        {
                            throw new Exception("Unhandled db exception.");
                        }
                    }
                }
            }
            if (success)
            {
                data.AcceptAllChanges();
            }
            else
            {
                throw new Exception();
            }
        }
    }
4

2 に答える 2

1

カスタム ビットを実行するデリゲート (またはラムダ) を関数に渡します。

このような

void AddItem<T>(string objDetails, Func<T> custom) {
  . 
  . common 
  . 
  .
  T someReturn = custom();
  . 
  . common 
  . 
}   

おそらく次のような呼び出しを追加します。

Func<int> custom = () => {
     // do something custom
     return 9;
}

// Call common function    
AddItem<int>(..., custom);

重要なのは、Func のインターフェイスが必要なものと一致することだけです。

于 2013-01-21T04:22:32.727 に答える
0

デリゲートとイベントを使用して、さまざまなメソッドを渡すことができます。これを行うクラスの例を次に示します。

class SampleClass
{
    public delegate void TransactionDelegate(); 
    public event TransactionDelegate MyTransactionDelegate;

    public void DoSomething()
    {
        MyTransactionDelegate(); 
    }

}

次に、ラムダ式を使用して、次のようにメソッドをイベントに渡すことができます。

class MainClass
{
    public static void Main (string[] args)
    {
        var test = new SampleClass(); 
        test.MyTransactionDelegate += () => {Console.WriteLine("Success");}; 
        test.DoSomething(); 
    }
}
于 2013-01-21T04:23:47.373 に答える