CacheEngine
using System;
using System.Threading;
using System.Threading.Tasks;
namespace Polly.Caching
{
internal static class CacheEngine
{
internal static TResult Implementation<TResult>(ICacheProvider<TResult> cacheProvider, ITtlStrategy ttlStrategy, ICacheKeyStrategy cacheKeyStrategy, Func<Context, CancellationToken, TResult> action, Context context, CancellationToken cancellationToken)
{
cancellationToken.ThrowIfCancellationRequested();
string cacheKey = cacheKeyStrategy.GetCacheKey(context);
if (cacheKey == null)
return action(context, cancellationToken);
TResult val = cacheProvider.Get(cacheKey);
if (val != null)
return val;
TResult val2 = action(context, cancellationToken);
TimeSpan ttl = ttlStrategy.GetTtl(context);
if (ttl > TimeSpan.Zero)
cacheProvider.Put(cacheKey, val2, ttl);
return val2;
}
internal static async Task<TResult> ImplementationAsync<TResult>(ICacheProviderAsync<TResult> cacheProvider, ITtlStrategy ttlStrategy, ICacheKeyStrategy cacheKeyStrategy, Func<Context, CancellationToken, Task<TResult>> action, Context context, CancellationToken cancellationToken, bool continueOnCapturedContext)
{
cancellationToken.ThrowIfCancellationRequested();
string cacheKey = cacheKeyStrategy.GetCacheKey(context);
if (cacheKey == null)
return await action(context, cancellationToken).ConfigureAwait(continueOnCapturedContext);
TResult val = await cacheProvider.GetAsync(cacheKey, cancellationToken, continueOnCapturedContext).ConfigureAwait(continueOnCapturedContext);
if (val != null)
return val;
TResult result = await action(context, cancellationToken).ConfigureAwait(continueOnCapturedContext);
TimeSpan ttl = ttlStrategy.GetTtl(context);
if (ttl > TimeSpan.Zero)
await cacheProvider.PutAsync(cacheKey, result, ttl, cancellationToken, continueOnCapturedContext).ConfigureAwait(continueOnCapturedContext);
return result;
}
}
}