使用SqlConnection转换为Func委托

时间:2012-02-12 22:04:27

标签: c# delegates

我有以下代码被复制并粘贴到许多地方。唯一的区别是在使用中间有一个调用会发生变化。所以我做了一个

public MyEntity Read(int id)
{
    using (SqlConnection sqlConn = new SqlConnection(ConnectionString))
    {
        sqlConn.Open();
        return MyDataLayer.Select(sqlConn, id);
    }
}

所以我想出了这个。但是,我的问题是如何将sqlConn var传递给调用?

public TResult UsingSqlConnection<TResult>(Func<TResult> myFunction)
{
    using (SqlConnection sqlConn = new SqlConnection(ConnectionString))
    {
        sqlConn.Open();
        return myFunction();
    }
}

public MyEntity Read(int id)
{
    return UsingSqlConnection(() => MyDataLayer.Read(id)); 
   //PROBLEM: Read() requires sqlConn
}

关闭我的头脑 - 看起来不是将其作为参数传递,我需要在MyDataLayer中为SqlConn创建一个属性,并使用接口在UsingSqlConnection方法中分配它。虽然我不排除那个重构,但我想知道我是否遗漏了一些东西,因为这是我第一次以这种方式与Func代表一起尝试。

1 个答案:

答案 0 :(得分:4)

Func可以有参数:

public TResult UsingSqlConnection<TResult>(Func<SqlConnection, TResult> myFunc)
{
    using (SqlConnection sqlConn = new SqlConnection(ConnectionString))
    {
        sqlConn.Open();
        return myFunc(sqlConn);
    }
}

public MyEntity Read(int id)
{
    return UsingSqlConnection((sqlConn) => MyDataLayer.Read(sqlConn, id));       
}