2013-03-04 6 views
-1

Dapper에서 각 db 호출에 대해 반복되는 코드를 숨기려고 래퍼를 작성하려고합니다. (즉, SQL 연결, 시도, 기본 잡기 및 마침내) 본질적으로 나는 다음 코드와 같은 것을하고 싶습니다만, 나는이 방법으로 generics int를 사용할 수없는 동적 매개 변수가 있다는 것을 이해합니다.제네릭 및 동적 인수에 대한 해결 방법

가되는 방법 나는 오류를 얻을 :

Consider casting the dynamic arguments or calling the extension method without the extension method syntax (refering to the conn.Query method)

작동 좋아 내 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; 
     } 
     } 
    } 
} 
+1

'그건. 'Close()'와'Dispose()'도 똑같은 일을합니다 (적어도 대개는 Dapper를 모르겠습니다). 그리고'using'은 한번 더'Dispose()'를 호출 할 것입니다. – svick

+0

질문과는 관계가 없지만'finally' 블록은 필요 없다고 생각합니다.'사용'은 이미 연결을 폐기 (그리고 닫음)하는 것을 처리합니다. – MiMo

+0

@svick이 동의하고'catch '도 쓸모가 없습니다. 로그 항목을 만들고 스택 추적없이 예외를 throw하여 나중에 다시 로그에 기록합니다. –

답변

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

나는 다음과 같이 헬퍼 메소드를 만들려고 (발신자가 첫 번째 또는 두 번째 옵션을 할 것입니다) 캐치하지 마십시오. 다른 레이어에서

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

: finally`이 완전히 쓸모

var param = new DynamicParameters(); 
param.Add("@name", name); 
var objGroupsList = _iDapper.GetAll<CustomerDTO>("dbo.GetCustomersList", param, CommandType.StoredProcedure).ToList();