0

我正在尝试编写一个包装器来隐藏我发现自己为 Dapper 中的每个 db 调用重复的大部分代码。(即 Sql Connection、try、default catch 和 finally)本质上我想做类似下面的代码,但我知道由于有一个动态参数,我不能以这种方式使用泛型 int。

我得到错误的方式是:

考虑强制转换动态参数或调用没有扩展方法语法的扩展方法(参考 conn.Query 方法)

有没有办法重构我的ExecuteQuery或类似的东西?

public abtract class IDbAccessService
{
   public LogService Logger { get; set; }

   public virtual IEnumerable<T> ExecuteQuery<T>(string sql, dynamic param, string connString)
      where T : BaseModel
   {
      using (var conn = DataAccessHelpers.GetOpenConnection(connString))
      {
         try
         {
            return conn.Query<T>(sql, param).ToList<T>();
         }
         catch (Exception ex)
         {
            Logger.Logger.Error(ex.Message, ex);
            throw ex;
         }
      }
   }
}
4

2 回答 2

1

扩展方法不能动态调度。所以在没有扩展方法语法的情况下调用它:

static IEnumerable<T> ExecuteQuery<T>(string sql, dynamic param, string connStr)
    where T : BaseModel
{
    using (var conn = DataAccessHelpers.GetOpenConnection(connStr))
    {
        return SqlMapper.Query(conn, sql, param).ToList<T>();
    }
}

此外,您还有无用的日志记录,它为单个错误创建多个日志条目,以及无用的连接处理(通过使用块自动完成)。

异常处理技巧:

  • 处理异常并记录它
  • 将异常包装在高级异常中并抛出该包装器(调用者将处理该高级异常,或者也将包装它)
  • 不要捕获异常(调用者将执行第一个或第二个选项)
于 2013-03-04T23:01:26.130 回答
1

我试图创建如下的辅助方法。

private SqlConnection GetSqlConnection()
        {
            var sqlConnection = new SqlConnection(ConfigurationManager.ConnectionStrings["con1"].ConnectionString);
            sqlConnection.Open();
            return sqlConnection;
        }

public IEnumerable<T> GetAll<T>(string query, object cmdParams = null, CommandType cmdType = CommandType.Text) where T : class
        {
            IEnumerable<T> objList;
            using (var conn = GetSqlConnection())
            {
                objList = conn.Query<T>(query, param: cmdParams, commandTimeout:0, commandType: cmdType);
                conn.Close();
            }
            return objList;
        }

 public IEnumerable<dynamic> Query(string query, object cmdParams = null, CommandType cmdType = CommandType.Text)
        {
            IEnumerable<dynamic> objDyn;
            using (var conn = GetSqlConnection())
            {
                objDyn = conn.Query(query, cmdParams, commandTimeout: 0, commandType: cmdType);
                conn.Close();
            }
            return objDyn;
        }

从另一层:

var param = new DynamicParameters();
param.Add("@name", name);
var objGroupsList = _iDapper.GetAll<CustomerDTO>("dbo.GetCustomersList", param, CommandType.StoredProcedure).ToList();
于 2013-03-04T23:01:52.263 回答