我最近开始重构由OOP经验不足的人设计的旧系统。幸运的是,(几乎)对数据库的所有访问都在一个3000行长的文件内。该文件包含Dictionary<string, SqlCommand>SqlConnection,这是一个很长的函数,它将每个单个SQL查询添加到字典中,如下所示:

cmd = new SqlCommand(null, _sqlConnection);
cmd.CommanText = "SELECT * FROM User WHERE User.UserID = @id;" // Most queries are far from being this simple
cmd.Parameters.Add(new SqlParameter("@id", SqlDbType.Int, 0));
cmd.Prepare();

_cmds.Add("getUser", cmd);


这些查询由同一文件中的函数使用,如下所示:

public void deleteUser(int userId)
{
    if (_cmds.TryGetValue("deleteUser", out SqlCommand cmd))
    {
        lock(cmd)
        {
            cmd.Parameters[0].Value = userId;
            cmd.ExecuteNonQuery();
        }
    }
}

public int isConnected(int userId, out int amount)
{
    bool result = false;
    amount = 0;

    if (_cmds.TryGetValue("userInfo", out SqlCommand cmd))
    {
        lock (cmd)
        {
            cmd.Parameters[0].Value = userId;

            using (SqlDataReader reader = new cmd.ExecuteReader())
            {
                 if (reader.HasRows)
                     while (reader.Read())
                     {
                         amount = (int)Math.Round(reader.GetDecimal(0));
                         result = reader.GetInt32(1);
                     }
            }
        }
    }


  return result;
}


现在,使用和维护它太可怕了。我终于有时间重构它。我想将其转换为带有存储库的适当DAL,该存储库将由服务使用并且可以注入依赖项。

我真的不在乎更改功能或查询(例如使用ORM)。我更感兴趣的是以一种允许我更轻松地模拟,测试和修改文件的方式将文件拆分为多个文件。尽管我知道需要大量复制/粘贴和重新编码,但我正在寻找一种更好地构造现有代码的方法。

最佳答案

建议使用诸如NHibernate之类的对象关系映射器替换手动编写的对象映射代码,这将节省创建和维护数据访问层的时间和精力。

09-30 12:55
查看更多