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

开发 前端
Func<T, TResult>封装一个具有一个参数并返回 TResult 参数指定的类型值的方法。使用Func<T, TResult> 委托表示一种能以参数形式传递的方法,而不用显式声明自定义委托。

[[380117]]

本文转载自微信公众号「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、查看日志。

 

责任编辑:武晓燕 来源: UP技术控
相关推荐

2021-02-14 20:41:56

API日志web

2009-09-10 13:13:47

Linq Func<T

2022-02-08 17:07:54

Spring BooSpring Aop日志记录

2021-03-01 23:26:41

日志Spring BootAOP

2009-08-10 09:41:07

.NET Lambda

2021-11-17 09:00:00

Kubernetes集群容器

2009-08-20 18:37:52

委托C#异步委托

2023-06-26 18:13:56

开源API

2020-12-14 06:48:42

Redis记录转存

2020-03-07 18:00:17

logzeroPython日志记录

2011-08-04 13:31:50

数据库记录更改日志触发器

2023-12-25 07:46:35

GatewayAPI开源

2011-12-26 16:47:07

C#

2021-05-10 23:39:31

Python日志记录

2023-06-26 10:51:56

开源API

2011-03-02 17:54:45

Pure-ftpd

2009-08-21 11:24:16

C#异步调用

2010-07-20 13:26:43

2023-10-10 09:19:59

日志Java

2021-07-05 00:06:46

.NET 内置程序
点赞
收藏

51CTO技术栈公众号