2012-02-12 76 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));  
}