Я пытаюсь написать оболочку, чтобы скрыть большую часть кода, который я нахожу, повторяя для каждого вызова db в Dapper. (а именно, Sql Connection, try, catch по умолчанию и, наконец). По сути, я хотел бы сделать что-то вроде следующего кода, но я понимаю, что из-за наличия динамического параметра я не могу использовать generics int this.Работайте для дженериков и динамических аргументов
так, как это я получаю ошибку:
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;
}
}
}
}
Это 'finally' совершенно бесполезно. 'Close()' и 'Dispose()' делают то же самое (по крайней мере, обычно, я не знаю Dapper). И это 'использование' еще раз вызовет' Dispose() '. – svick
Не связанный с вопросом, но я думаю, что блок 'finally' не нужен -' use' уже заботится о том, чтобы всегда утилизировать (и, следовательно, закрывать) соединение – MiMo
@svick согласен, а 'catch' также бесполезен. Он создает запись в журнале и выдает исключение без stacktrace для последующего входа в систему еще раз –