使用Func 委託實現API日誌的記錄

問題

日常咱們開發web api的時候,通常是須要記錄api的輸入輸出信息,方便後續排查問題;那麼咱們通常怎麼作的,通常是咱們在一個公共地方的寫個公共方法控制輸入輸出。這時候Func<T, TResult> 委託就派上用場。web

什麼是Func

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;
        }

三、查看日誌。日誌

相關文章
相關標籤/搜索