场景:很多时候接口的执行,我们在完成方法执行的本身,需要做额外的一些日志记录、异常捕获、参数验证等。
封装端代码:
/// <summary>
/// 代理执行
/// </summary>
/// <typeparam name="T">请求参数类型</typeparam>
/// <typeparam name="R">返回参数类型</typeparam>
/// <param name="func">执行都方法</param>
/// <param name="request">请求参数</param>
/// <returns></returns>
protected ResultMessage<R> ProxyExecute<T, R>(Func<T, ResultMessage<R>> func, T request)
{
var result = Activator.CreateInstance<ResultMessage<R>>();
var logStr = new StringBuilder();
try
{
logStr.AppendFormat("请求参数:{0}", JsonConvert.SerializeObject(request)); // 记录请求日志
//参数验证
request = ValidateHelper.ValidateParameter(request);
//方法执行
result = func(request);
logStr.AppendFormat("返回参数:{0}", JsonConvert.SerializeObject(result)); // 记录返回日志
}
catch (Exception ex)
{
result.ResultCode = ResultCode.Exception;
result.ResultMsg = ex.Message;
logStr.AppendFormat("异常信息:{0}", ex.Message); // 记录异常日志
}
finally
{
//记录日志
//WriteLog(logStr.ToString();)
}
return result;
}
调用端代码:
/// <summary>
/// 获取用户姓名
/// </summary>
/// <param name="request"></param>
/// <returns></returns>
[HttpPost]
public ResultMessage<StudentEntity> GetStudent(FindStudentRequest request)
{
return ProxyExecute(StuService.GetStudent, request);
}
项目源码:https://pan.baidu.com/s/1BXCpcZy9Ew3cvGkIwqhW2Q yg0a
当前代理封装其实为乞丐版,其实里面可以无限扩充,例如请求里面的用户权限验证、加密、解密、并发控制等,详情见接口自定义代理V2