Exemplo n.º 1
0
        public override async Task <IResult <TResponse> > Handle(TRequest request, CancellationToken cancellationToken)
        {
            var       code = GenerateKey(request);
            TResponse existing;

            if (request.CacheControl != CacheControl.NoCache)
            {
                existing = _cacheService.Get <TResponse>(code);

                if (existing != null)
                {
                    request.CompletedFromCache = true;
                    OnGotFromCache(existing, code);
                    return(Result.Success(existing));
                }
            }

            if (request.CacheControl == CacheControl.OnlyIfCached)
            {
                return(Result.Failure <TResponse>(ErrorCodes.NotFound));
            }

            var result = await HandleImpl(request, cancellationToken)
                         .ConfigureAwait(false);

            if (result.IsFailure)
            {
                return(result);
            }

            var regions = Enum.GetValues <CacheRegion>()
                          .Where(r => request.CacheRegion.HasFlag(r))
                          .Select(r => r.ToString())
                          .ToArray();

            _cacheService.Add(result.Value, code, regions);

            OnAddedToCache(result.Value, code, request.CacheRegion.ToString());

            return(result);
        }