跨N层使用“使用语句”

时间:2012-01-31 19:20:45

标签: c#

我最近继承了一个带有4层设置的.Net Web App。按照这些情况的正常情况,我没有文档,也没有与之前的开发人员联系。该应用程序的前一个团队的成员有着截然不同的习惯,我正在尝试对这些代码进行重构/标准化。我遇到了一些我以前从未见过的东西(我无法找到任何地方或任何人实现这个作为练习),其中一个/多个开发人员将所有DataSet包装在using语句中,因为它通过层返回。我一见到它就想把它扔掉。在许多这些实现中,可读性被拍摄。然后我开始质疑自己,因为我无法想象有人这样做是因为。我理解在使用对象时处理对象的愿望,但这似乎有人过火了。有没有人知道实施这个的可靠理由?

这是一个关于正在做什么的TLDR示例。

演示:

using (DataSet ds = objCustomerFBO.FetchCustomerInfo(base.KeyID))
{
    grdCustomerInfo.DataSource = ds;
}
grdCustomerInfo.DataBind();

对象:

public DataSet FetchCustomerInfo(int keyID)
{
    using (DataSet ds = objCustomerEBO.FetchCustomerInfo(keyID);
    {
         return ds;
    }
}

商务:

public DataSet FetchCustomerInfo(int keyID)
{
    SqlParameter arrSqlParam = new SqlParameter[1];
    arrSqlParam[0] = new SqlParameter("@CustomerID", SqlDbType.Int);
    arrSqlParam[0].Value = keyID;

    using (DataSet ds = CommonEBO.ExecuteDataSet("FetchCustomerInfo", arrSqlParam);
    {
         return ds;
    }
}

数据(通过重载过滤后):

public static DataSet ExecuteDataSet(string strCommandText, SqlParameter[] SqlParams, CommandType commandtype, string strConnectionString)
    {
        DataSet ds = new DataSet();
        try
        {
            using (SqlDataAdapter oAdpt = new SqlDataAdapter(CMSOnlineDH.CreateCommand(strCommandText, SqlParams, commandtype, strConnectionString)))
            {
                oAdpt.SelectCommand.Connection.Open();
                oAdpt.Fill(ds);
            }
        }
        catch { throw; }
        return ds;
    }

3 个答案:

答案 0 :(得分:2)

我没有在using语句中看到包围实例化对象的return的点。这些我会删除,因为它只会妨碍可读性。

第一个例子也没有多大意义 - 因为调用DataBind需要在绑定的DataSet上操作,在<{1>之外执行绑定 语句没什么意义。我会把它放在using声明中。

对我来说唯一正确的用法是using(最后一个例子)。

总之,看起来有人接受了建议,总是对实现DataAdapter的对象使用using语句。

答案 1 :(得分:2)

没有错,因为你继承了它并且它的工作。 我相信ExecuteDataSet可能是使用声明所需的唯一地方。 根据当然提供的信息。但是,如果你已经删除了可能是另一个故事的连接信息和其他资源的片段。

例如,表示层的目的是围绕一个using语句,它从返回的数据集中获取其值???

这究竟是什么影响?我认为最终它会影响其他程序员(正如你在这里发布的)关于可读性和理解究竟是什么。当你的眼睛筛选所有代码时,它会产生额外的噪音。

答案 2 :(得分:1)

看起来处理数据集并没有带来任何好处,因为IDisposable它没有实现(have a look here)。