澄清c#代表/方法

时间:2013-01-21 04:14:47

标签: c# .net sql-server entity-framework transactions

我过去曾使用过代表,所以我很熟悉它们的用途和好处。我也做了很多阅读/研究,但我试图绕过这个并且无处可去。我想使用委托(我相信)来封装一些代码或在方法中使用委托调用一些外部代码。

我在20个不同的地方使用相同的代码来包装事务中的实体框架更新。我希望代码在一个地方;但是,我不能单独在一个方法中这样做,因为每次都会改变一个中间部分。我正在寻找一些关于如何最好地做到这一点的想法/澄清(.net 3.5,ms sql 2010)。 - 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();
            }
        }
    }

2 个答案:

答案 0 :(得分:1)

您将函数传递给执行自定义位

的委托(或lambda) 像这样

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的界面符合你的需要。

答案 1 :(得分:0)

您可以使用委托和事件传递不同的方法。以下是执行此操作的类的示例:

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

    public void DoSomething()
    {
        MyTransactionDelegate(); 
    }

}

然后,您可以使用lambda表达式将方法传递给事件,如下所示:

class MainClass
{
    public static void Main (string[] args)
    {
        var test = new SampleClass(); 
        test.MyTransactionDelegate += () => {Console.WriteLine("Success");}; 
        test.DoSomething(); 
    }
}