日常咱們開發web api的時候,通常是須要記錄api的輸入輸出信息,方便後續排查問題;那麼咱們通常怎麼作的,通常是咱們在一個公共地方的寫個公共方法控制輸入輸出。這時候Func<T, TResult> 委託就派上用場。web
Func<T, TResult>封裝一個具備一個參數並返回 TResult 參數指定的類型值的方法。使用Func<T, TResult> 委託表示一種能以參數形式傳遞的方法,而不用顯式聲明自定義委託。 封裝的方法必須與此委託定義的方法簽名相對應。 也就是說,封裝的方法必須具備一個經過值傳遞給它的參數,而且必須返回值。在使用 Func<T, TResult> 委託時,沒必要顯式定義一個封裝只有一個參數的方法的委託。api
一、定義委託。編輯器
private ApiResult HandleWork(CreateBQoolSyncEventModel syncModel, Func<ApiResult> work) { //先記錄到 Db Event _innerBQoolSyncEventLogService.Create(syncModel); var result = new ApiResult(); try { _logger.Info($"Call Web Api Start, data:{syncModel.ToJsonString()}"); result = work(); if (!result.Success && !string.IsNullOrEmpty(result.Code) && string.IsNullOrEmpty(result.ErrorMessage)) { result.ErrorMessage = ApiResultCode.ErrorMessages[result.Code]; } } catch (Exception ex) { _logger.Error(ex.ToString()); result.Success = false; if (string.IsNullOrEmpty(result.ErrorMessage)) { result.ErrorMessage = ex.Message; } else { result.ErrorMessage += "; " + ex.Message; } } finally { _logger.Info($"Call Web Api End , result:{result.ToJsonString()}"); //更新 Db event syncModel.SetStatus(result.Success ? BQoolSyncEventStatus.Success : BQoolSyncEventStatus.Failure); _innerBQoolSyncEventLogService.ChangeStatus(syncModel.Id, syncModel.Status, result.ErrorMessage); } return result; }
二、把方法當作參數,傳入委託。spa
[HttpPost] public ApiResult ModuleFeatureSetting(ReviewsApiRequestModel model) { string data = StringTools.AESDecrypt(model.Encrypt); var param = JObject.Parse(data).ToObject<ModuleFeatureSettingParam>(); ApiResult result = HandleWork( new CreateBQoolSyncEventModel(param.Account, BQoolSyncEventType.ModuleFeatureSetting, param) , () => _ReviewsSettingSyncService.ModuleFeatureSetting(param)); return result; }
三、查看日誌。日誌