可以參考dapper源碼,或者反編譯壹下dapper.dll,在dapper之上再封裝壹層拓展方法,正好最近我也在做這個,下面代碼可以參考壹下:
using?Dapper;//封裝的拓展類
public?static?class?DapperExtension
{
public?static?int?CExecute(this?IDbConnection?cnn,?string?sql,?object?param?=?null,?IDbTransaction?transaction?=?null,?int?commandTimeout?=?null,?CommandType?commandType?=?null)
{
var?beginTime?=?DateTime.Now;
return?SqlMapper.Execute(cnn,?sql,?param,?transaction,?commandTimeout,?commandType).ToLog(sql,param,?beginTime);
}
public?static?int?CExecute(this?IDbConnection?cnn,?CommandDefinition?command)
{
var?beginTime?=?DateTime.Now;
return?SqlMapper.Execute(cnn,?command).ToLog(command.CommandText,command.Parameters,beginTime);
}
……
}
//日誌記錄拓展方法
private?static?T?ToLog<T>(this?T?result,?string?sql,?object?param,?DateTime?beginTime,?IDbConnection?conn?=null)
{
//日誌記錄要異步進行,防止日誌記錄時報錯,影響業務流程
Task.Run(()=>?{
var?now?=?DateTime.Now;
var?log?=?new?LogModel()
{
CreateTime?=?now,
SqlStr?=?sql,
ExcuteResult?=?result.ToJsonString(),
Timespan?=?(now?-?beginTime).TotalMilliseconds
};
if?(param?!=?null)
{
foreach?(var?p?in?param.GetType().GetProperties())
{
log.SqlStr=log.SqlStr.Replace("@"+p.Name,p.GetValue(param).ToString());
}
}
//日誌記錄到MongoDB中
MongoDbHelper.SetCollection(log,?"Log_"+?now.ToString("yyyyMMdd"),?"ExcuteLog");
});
return?result;
}//調用示例:
public?int?GetInfo(string?sql,?object?param?=?null)
{
var?connStr="....";//數據庫連接字符串using?(var?conn?=?new?MySqlConnection(connStr))
{
var?result?=?conn.CExecute(sql,?param);
return?result;
}
}