解决泛型和动态参数问题

时间:2013-03-04 22:23:44

标签: c# dynamic dapper service-layer

我正在尝试编写一个包装器来隐藏我在Dapper中为每个db调用重复的大部分代码。 (即Sql连接,尝试,默认捕获,最后)基本上我想做类似下面的代码,但我明白,因为有一个动态参数我不能用这种方式使用泛型。

我得到错误的方式是:

  

考虑在没有扩展方法语法的情况下强制转换动态参数或调用扩展方法(参考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;
         }
      }
   }
}

2 个答案:

答案 0 :(得分: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>();
    }
}

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

异常处理提示:

  • 处理异常并将其记录
  • 在高级异常中包装异常并抛出该包装器(调用者将处理该高级异常,或者也将其包装)
  • 不要捕获异常(来电者会做第一个或第二个选项)

答案 1 :(得分: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();