ジェネリックスと動的引数のための回避策

c# dapper dynamic 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;
         }
      }
   }
}

受け入れられた回答

拡張メソッドを動的にディスパッチすることはできません。そのため、拡張メソッドの構文を使用しないで呼び出します。

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または第2のオプションを実行する)

人気のある回答

私は以下のようにヘルパーメソッドを作成しようとしました。

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();


ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ