public async Task <GetForeignExchangeRateResponse> Handle(GetForeignExchangeRateRequest request, CancellationToken cancellationToken) { var response = new GetForeignExchangeRateResponse(); var publicationDate = _publicationDateService.GetPublicationDate(request.Date); string cacheKey = _foreignExchangeRatesService.GetCacheKey(request.Base, request.Date, publicationDate); var dateAsInt = Convert.ToInt32(request.Date); var foreignExchangeRates = await _cachingService.GetOrCreateAsync ( cacheKey, () => { return(_unitOfWork.ForeignExchangeRate .GetWhereAsync(x => x.BaseCurrency == request.Base && x.Date == dateAsInt && x.PublicationDate == publicationDate)); }, AppConstants.CacheDurationInHourForeignExchangeRatesOfCurrency ); if (ListExtensions.IsNullOrEmpty(foreignExchangeRates)) { foreignExchangeRates = await _foreignExchangeRatesService.GetForeignExchangeRateModels(request.Base, request.Date); var foreignExchangeRatesToDelete = await _unitOfWork.ForeignExchangeRate.GetWhereAsync(x => x.BaseCurrency == request.Base && x.Date == dateAsInt && x.PublicationDate == publicationDate); await _unitOfWork.ForeignExchangeRate.BulkSaveAsync(foreignExchangeRates, foreignExchangeRatesToDelete); if (!ListExtensions.IsNullOrEmpty(foreignExchangeRates) || !ListExtensions.IsNullOrEmpty(foreignExchangeRatesToDelete)) { await _unitOfWork.CompleteAsync(); } await _cachingService.SetAsync(cacheKey, foreignExchangeRates); } if (ListExtensions.IsNullOrEmpty(foreignExchangeRates)) { foreignExchangeRates = new List <ForeignExchangeRateModel>(); } response.Data = _foreignExchangeRatesService.ToInverseRatesDto(request.Base, foreignExchangeRates); return(response); }