PolicyWrap
A policy that allows two (and by recursion more) Polly policies to wrap executions of delegates.
using System;
using System.Threading;
using System.Threading.Tasks;
namespace Polly.Wrap
{
public class PolicyWrap : Policy, IPolicyWrap, IsPolicy
{
private IsPolicy _outer;
private IsPolicy _inner;
public IsPolicy Outer => _outer;
public IsPolicy Inner => _inner;
internal override void SetPolicyContext(Context executionContext)
{
if (executionContext.PolicyWrapKey == null)
executionContext.PolicyWrapKey = base.PolicyKey;
base.SetPolicyContext(executionContext);
}
internal PolicyWrap(Action<Action<Context, CancellationToken>, Context, CancellationToken> policyAction, Policy outer, ISyncPolicy inner)
: base(policyAction, outer.ExceptionPredicates)
{
_outer = outer;
_inner = inner;
}
public override TResult ExecuteInternal<TResult>(Func<Context, CancellationToken, TResult> action, Context context, CancellationToken cancellationToken)
{
return PolicyWrapEngine.Implementation(action, context, cancellationToken, (ISyncPolicy)_outer, (ISyncPolicy)_inner);
}
internal PolicyWrap(Func<Func<Context, CancellationToken, Task>, Context, CancellationToken, bool, Task> policyAction, Policy outer, IAsyncPolicy inner)
: base(policyAction, outer.ExceptionPredicates)
{
_outer = outer;
_inner = inner;
}
public override Task<TResult> ExecuteAsyncInternal<TResult>(Func<Context, CancellationToken, Task<TResult>> action, Context context, CancellationToken cancellationToken, bool continueOnCapturedContext)
{
return PolicyWrapEngine.ImplementationAsync(action, context, cancellationToken, continueOnCapturedContext, (IAsyncPolicy)_outer, (IAsyncPolicy)_inner);
}
}
}