ContextualPolicy
Transient exception handling policies that can be applied to delegates.
These policies can be called with arbitrary context data.
using System;
using System.Collections.Generic;
using System.Diagnostics;
namespace Polly
{
public class ContextualPolicy
{
private readonly Action<Action, Context> _exceptionPolicy;
internal ContextualPolicy(Action<Action, Context> exceptionPolicy)
{
if (exceptionPolicy == null)
throw new ArgumentNullException("exceptionPolicy");
_exceptionPolicy = exceptionPolicy;
}
[DebuggerStepThrough]
public void Execute(Action action, IDictionary<string, object> contextData)
{
if (contextData == null)
throw new ArgumentNullException("contextData");
Execute(action, new Context(contextData));
}
[DebuggerStepThrough]
public void Execute(Action action)
{
Execute(action, Context.Empty);
}
[DebuggerStepThrough]
private void Execute(Action action, Context context)
{
_exceptionPolicy(action, context);
}
[DebuggerStepThrough]
public TResult Execute<TResult>(Func<TResult> action, IDictionary<string, object> contextData)
{
if (contextData == null)
throw new ArgumentNullException("contextData");
return Execute(action, new Context(contextData));
}
[DebuggerStepThrough]
public TResult Execute<TResult>(Func<TResult> action)
{
return Execute(action, Context.Empty);
}
[DebuggerStepThrough]
private TResult Execute<TResult>(Func<TResult> action, Context context)
{
TResult result = (TResult)default(TResult);
_exceptionPolicy(delegate {
result = (TResult)action();
}, context);
return (TResult)result;
}
}
}