2012-02-12 5 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 
} 

- それは私がMyDataLayerにSqlConnのプロパティを作成し、インターフェイスを使用してUsingSqlConnection方法でそれを割り当てる必要があること、代わりにPARAMとしてそれを渡すように見えます。私はリファクタリングを除外しませんが、これは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));  
} 
関連する問題