我有以下代码被复制并粘贴到许多地方。唯一的区别是在使用中间有一个调用会发生变化。所以我做了一个
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代表一起尝试。
答案 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));
}