PolicyWrap<TResult>
using System;
using System.Threading;
namespace Polly.Wrap
{
public class PolicyWrap<TResult> : Policy<TResult>, IPolicyWrap<TResult>, IPolicyWrap, IsPolicy
{
private readonly ISyncPolicy _outerNonGeneric;
private readonly ISyncPolicy _innerNonGeneric;
private readonly ISyncPolicy<TResult> _outerGeneric;
private readonly ISyncPolicy<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 PolicyWrap(Policy outer, ISyncPolicy<TResult> inner)
: base(outer.ExceptionPredicates, ResultPredicates<TResult>.None)
{
_outerNonGeneric = outer;
_innerGeneric = inner;
}
internal PolicyWrap(Policy<TResult> outer, ISyncPolicy inner)
: base(outer.ExceptionPredicates, outer.ResultPredicates)
{
_outerGeneric = outer;
_innerNonGeneric = inner;
}
internal PolicyWrap(Policy<TResult> outer, ISyncPolicy<TResult> inner)
: base(outer.ExceptionPredicates, outer.ResultPredicates)
{
_outerGeneric = outer;
_innerGeneric = inner;
}
protected override TResult Implementation(Func<Context, CancellationToken, TResult> action, Context context, CancellationToken cancellationToken)
{
if (_outerNonGeneric != null) {
if (_innerNonGeneric != null)
return PolicyWrapEngine.Implementation<TResult>(action, context, cancellationToken, _outerNonGeneric, _innerNonGeneric);
if (_innerGeneric != null)
return PolicyWrapEngine.Implementation<TResult>(action, context, cancellationToken, _outerNonGeneric, _innerGeneric);
throw new InvalidOperationException("A PolicyWrap must define an inner policy.");
}
if (_outerGeneric != null) {
if (_innerNonGeneric != null)
return PolicyWrapEngine.Implementation<TResult>(action, context, cancellationToken, _outerGeneric, _innerNonGeneric);
if (_innerGeneric != null)
return PolicyWrapEngine.Implementation<TResult>(action, context, cancellationToken, _outerGeneric, _innerGeneric);
throw new InvalidOperationException("A PolicyWrap must define an inner policy.");
}
throw new InvalidOperationException("A PolicyWrap must define an outer policy.");
}
}
}