AsyncPolicyWrap<TResult>
public class AsyncPolicyWrap<TResult> : AsyncPolicy<TResult>, IPolicyWrap<TResult>, IPolicyWrap, IsPolicy
A policy that allows two (and by recursion more) async Polly policies to wrap executions of async delegates.
using System;
using System.Threading;
using System.Threading.Tasks;
namespace Polly.Wrap
{
public class AsyncPolicyWrap<TResult> : AsyncPolicy<TResult>, IPolicyWrap<TResult>, IPolicyWrap, IsPolicy
{
private readonly IAsyncPolicy _outerNonGeneric;
private readonly IAsyncPolicy _innerNonGeneric;
private readonly IAsyncPolicy<TResult> _outerGeneric;
private readonly IAsyncPolicy<TResult> _innerGeneric;
public IsPolicy Outer {
get {
IsPolicy outerGeneric = _outerGeneric;
return outerGeneric ?? _outerNonGeneric;
}
}
public IsPolicy Inner {
get {
IsPolicy innerGeneric = _innerGeneric;
return innerGeneric ?? _innerNonGeneric;
}
}
internal override void SetPolicyContext(Context executionContext, out string priorPolicyWrapKey, out string priorPolicyKey)
{
priorPolicyWrapKey = executionContext.PolicyWrapKey;
priorPolicyKey = executionContext.PolicyKey;
if (executionContext.PolicyWrapKey == null)
executionContext.PolicyWrapKey = base.PolicyKey;
base.SetPolicyContext(executionContext, out string _, out string _);
}
internal AsyncPolicyWrap(AsyncPolicy outer, IAsyncPolicy<TResult> inner)
: base(outer.ExceptionPredicates, ResultPredicates<TResult>.None)
{
_outerNonGeneric = outer;
_innerGeneric = inner;
}
internal AsyncPolicyWrap(AsyncPolicy<TResult> outer, IAsyncPolicy inner)
: base(outer.ExceptionPredicates, outer.ResultPredicates)
{
_outerGeneric = outer;
_innerNonGeneric = inner;
}
internal AsyncPolicyWrap(AsyncPolicy<TResult> outer, IAsyncPolicy<TResult> inner)
: base(outer.ExceptionPredicates, outer.ResultPredicates)
{
_outerGeneric = outer;
_innerGeneric = inner;
}
protected override Task<TResult> ImplementationAsync(Func<Context, CancellationToken, Task<TResult>> action, Context context, CancellationToken cancellationToken, bool continueOnCapturedContext)
{
if (_outerNonGeneric != null) {
if (_innerNonGeneric != null)
return AsyncPolicyWrapEngine.ImplementationAsync<TResult>(action, context, continueOnCapturedContext, _outerNonGeneric, _innerNonGeneric, cancellationToken);
if (_innerGeneric != null)
return AsyncPolicyWrapEngine.ImplementationAsync<TResult>(action, context, continueOnCapturedContext, _outerNonGeneric, _innerGeneric, cancellationToken);
throw new InvalidOperationException("A AsyncPolicyWrap must define an inner policy.");
}
if (_outerGeneric != null) {
if (_innerNonGeneric != null)
return AsyncPolicyWrapEngine.ImplementationAsync<TResult>(action, context, continueOnCapturedContext, _outerGeneric, _innerNonGeneric, cancellationToken);
if (_innerGeneric != null)
return AsyncPolicyWrapEngine.ImplementationAsync<TResult>(action, context, continueOnCapturedContext, _outerGeneric, _innerGeneric, cancellationToken);
throw new InvalidOperationException("A AsyncPolicyWrap must define an inner policy.");
}
throw new InvalidOperationException("A AsyncPolicyWrap must define an outer policy.");
}
}
}