0

Dapperでdbを呼び出すたびに繰り返すコードの多くを隠すために、ラッパーを作成しようとしています。(つまり、SQL接続、try、デフォルトのキャッチ、そして最後に)基本的に次のコードのようなことをしたいのですが、動的パラメーターがあるため、ジェネリックス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>();
    }
}

また、単一のエラーに対して複数のログエントリを作成する無用なログと、無用な接続の破棄(ブロックを使用して自動的に実行されます)があります。

例外処理のヒント:

  • 例外を処理してログに記録する
  • 例外を高レベルの例外でラップし、そのラッパーをスローします(呼び出し元はその高レベルの例外を処理するか、またはラップします)
  • 例外をキャッチしないでください(呼び出し元は最初または2番目のオプションを実行します)
于 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 に答える