제네릭 및 동적 인수에 대한 해결 방법

c# dapper dynamic service-layer

문제

Dapper에서 각 db 호출마다 반복되는 코드를 숨기려고 래퍼를 작성하려고합니다. (즉, SQL 연결, 시도, 기본 잡기 및 마침내) 본질적으로 나는 다음 코드와 같은 것을하고 싶습니다만, 나는이 방법으로 generics 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;
         }
      }
   }
}

수락 된 답변

확장 메서드는 동적으로 디스패치 할 수 없습니다. 따라서 확장 메서드 구문없이 호출하십시오.

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

또한 단일 오류에 대한 다중 로그 항목을 작성하는 쓸모없는 로깅 및 쓸모없는 연결 처리 (블록을 사용하여 자동으로 수행됨)가 있습니다.

예외 처리 팁 :

  • 예외 처리 및 기록
  • 상위 예외에서 예외를 래핑하고 해당 래퍼를 throw합니다 (호출자는 상위 예외를 처리하거나 래핑합니다)
  • 예외를 catch하지 않습니다 (호출자가 첫 번째 또는 두 번째 옵션을 수행함).

인기 답변

아래와 같이 도우미 메서드를 만들려고했습니다.

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
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow