<PackageReference Include="Polly" Version="5.6.0" />

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); } } }