Преобразование с использованием SqlConnection в делегат Func - PullRequest
0 голосов
/ 13 февраля 2012

У меня есть следующий код, который копируется и вставляется в нескольких местах.Единственное отличие состоит в том, что в середине употребления происходит один звонок, который меняется.Итак, я сделал

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

Итак, я придумал это.Однако моя проблема заключается в том, как передать переменную sqlConn в вызов?

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
}

Вне головы - похоже, вместо того, чтобы передавать его как параметр, мне нужно создать свойстводля SqlConn в MyDataLayer и назначьте его в методе UsingSqlConnection с помощью интерфейса.Хотя я не исключаю этого рефактора, мне интересно, что я что-то упустил, так как это моя первая попытка с делегатами Func таким образом.

1 Ответ

4 голосов
/ 13 февраля 2012

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));       
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...