IDC

使用Func<T, TResult> 委托实现API日志的记录

作者:admin 2021-06-14 我要评论

本文转载自微信公众号「UP技术控」,作者 conan5566 。转载本文请联系UP技术控公众号。 问题 平常我们开发web api的时候,一般是需要记录api的输入输出信息,方...

在说正事之前,我要推荐一个福利:你还在原价购买阿里云、腾讯云、华为云服务器吗?那太亏啦!来这里,新购、升级、续费都打折,能够为您省60%的钱呢!2核4G企业级云服务器低至69元/年,点击进去看看吧>>>)

本文转载自微信公众号「UP技术控」,作者 conan5566 。转载本文请联系UP技术控公众号。

问题

平常我们开发web api的时候,一般是需要记录api的输入输出信息,方便后续排查问题;那么我们一般怎么做的,一般是我们在一个公共地方的写个公共方法控制输入输出。这时候Func

什么是Func

Func<T, TResult>封装一个具有一个参数并返回 TResult 参数指定的类型值的方法。使用Func<T, TResult> 委托表示一种能以参数形式传递的方法,而不用显式声明自定义委托。 封装的方法必须与此委托定义的方法签名相对应。 也就是说,封装的方法必须具有一个通过值传递给它的参数,并且必须返回值。在使用 Func<T, TResult> 委托时,不必显式定义一个封装只有一个参数的方法的委托。

主要代码实现

1、定义委托。

  1. private ApiResult HandleWork(CreateBQoolSyncEventModel syncModel, Func<ApiResult> work
  2.         { 
  3.             //先記錄到 Db Event 
  4.             _innerBQoolSyncEventLogService.Create(syncModel); 
  5.  
  6.             var result = new ApiResult(); 
  7.             try 
  8.             { 
  9.                 _logger.Info($"Call Web Api Start, data:{syncModel.ToJsonString()}"); 
  10.                 result = work(); 
  11.                 if (!result.Success && !string.IsNullOrEmpty(result.Code) && string.IsNullOrEmpty(result.ErrorMessage)) 
  12.                 { 
  13.                     result.ErrorMessage = ApiResultCode.ErrorMessages[result.Code]; 
  14.                 } 
  15.             } 
  16.             catch (Exception ex) 
  17.             { 
  18.                 _logger.Error(ex.ToString()); 
  19.                 result.Success = false
  20.                 if (string.IsNullOrEmpty(result.ErrorMessage)) 
  21.                 { 
  22.                     result.ErrorMessage = ex.Message; 
  23.                 } 
  24.                 else 
  25.                 { 
  26.                     result.ErrorMessage += "; " + ex.Message; 
  27.                 } 
  28.             } 
  29.             finally 
  30.             { 
  31.                 _logger.Info($"Call Web Api End , result:{result.ToJsonString()}"); 
  32.  
  33.                 //更新 Db event 
  34.                 syncModel.SetStatus(result.Success ? BQoolSyncEventStatus.Success : BQoolSyncEventStatus.Failure); 
  35.                 _innerBQoolSyncEventLogService.ChangeStatus(syncModel.Id, syncModel.Status, result.ErrorMessage); 
  36.             } 
  37.  
  38.             return result; 
  39.         } 

2、把方法当做参数,传入委托。

  1. [HttpPost] 
  2.         public ApiResult ModuleFeatureSetting(ReviewsApiRequestModel model) 
  3.         { 
  4.             string data = StringTools.AESDecrypt(model.Encrypt); 
  5.             var param = JObject.Parse(data).ToObject<ModuleFeatureSettingParam>(); 
  6.  
  7.             ApiResult result = HandleWork( 
  8.                 new CreateBQoolSyncEventModel(param.Account, BQoolSyncEventType.ModuleFeatureSetting, param) 
  9.                 , () => _ReviewsSettingSyncService.ModuleFeatureSetting(param)); 
  10.  
  11.             return result; 
  12.         } 

3、查看日志。


本文转载自网络,原文链接:https://mp.weixin.qq.com/s/_l8Y97sZvBJjsxJTe4sLCA

版权声明:本文转载自网络,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。本站转载出于传播更多优秀技术知识之目的,如有侵权请联系QQ/微信:153890879删除

相关文章
  • 【活动回顾】Edge X Kubernetes,探索

    【活动回顾】Edge X Kubernetes,探索

  • 云端赛车-Amazon DeepRacer 的前世今生

    云端赛车-Amazon DeepRacer 的前世今生

  • 云原生时代,企业多活容灾体系构建思路

    云原生时代,企业多活容灾体系构建思路

  • 如何帮用户管好云账本?阿里云数据库助

    如何帮用户管好云账本?阿里云数据库助

腾讯云代理商
海外云服务器