【问题标题】:Converting using SqlConnection to Func delegate使用 SqlConnection 转换为 Func 委托
【发布时间】:2012-03-04 10:05:14
【问题描述】:

我有以下代码被复制并粘贴到许多地方。唯一的区别是在使用的中间有一个单独的调用会改变。所以我做了一个

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 代表。

【问题讨论】:

    标签: c# delegates


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-08
      • 1970-01-01
      • 2013-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-27
      • 1970-01-01
      相关资源
      最近更新 更多