2012-02-12 53 views
0

我有以下代码被复制并粘贴在多个位置。唯一的区别是在使用中发生了一次变更。所以我做了一个使用SqlConnection转换为Func委托

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 
} 

关闭我的头顶 - 它看起来像,而不是把它当作一个PARAM,我需要在MyDataLayer创建SqlConn一个属性,使用接口为它分配在UsingSqlConnection方法。虽然我不会排除重构,但我想知道是否我错过了一些东西,因为这是我用Func代表的第一次尝试。

回答

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));  
}