CircuitBreakerTResultSyntax
Fluent API for defining a Circuit Breaker Policy.
using Polly.CircuitBreaker;
using System;
using System.Collections.Generic;
using System.Threading;
namespace Polly
{
public static class CircuitBreakerTResultSyntax
{
public static CircuitBreakerPolicy<TResult> CircuitBreaker<TResult>(this PolicyBuilder<TResult> policyBuilder, int handledEventsAllowedBeforeBreaking, TimeSpan durationOfBreak)
{
Action<DelegateResult<TResult>, TimeSpan> onBreak = delegate {
};
Action onReset = delegate {
};
return policyBuilder.CircuitBreaker(handledEventsAllowedBeforeBreaking, durationOfBreak, onBreak, onReset);
}
public static CircuitBreakerPolicy<TResult> CircuitBreaker<TResult>(this PolicyBuilder<TResult> policyBuilder, int handledEventsAllowedBeforeBreaking, TimeSpan durationOfBreak, Action<DelegateResult<TResult>, TimeSpan> onBreak, Action onReset)
{
return policyBuilder.CircuitBreaker(handledEventsAllowedBeforeBreaking, durationOfBreak, delegate(DelegateResult<TResult> outcome, TimeSpan timespan, Context context) {
onBreak(outcome, timespan);
}, delegate {
onReset();
});
}
public static CircuitBreakerPolicy<TResult> CircuitBreaker<TResult>(this PolicyBuilder<TResult> policyBuilder, int handledEventsAllowedBeforeBreaking, TimeSpan durationOfBreak, Action<DelegateResult<TResult>, TimeSpan, Context> onBreak, Action<Context> onReset)
{
Action onHalfOpen = delegate {
};
return policyBuilder.CircuitBreaker(handledEventsAllowedBeforeBreaking, durationOfBreak, onBreak, onReset, onHalfOpen);
}
public static CircuitBreakerPolicy<TResult> CircuitBreaker<TResult>(this PolicyBuilder<TResult> policyBuilder, int handledEventsAllowedBeforeBreaking, TimeSpan durationOfBreak, Action<DelegateResult<TResult>, TimeSpan> onBreak, Action onReset, Action onHalfOpen)
{
return policyBuilder.CircuitBreaker(handledEventsAllowedBeforeBreaking, durationOfBreak, delegate(DelegateResult<TResult> outcome, TimeSpan timespan, Context context) {
onBreak(outcome, timespan);
}, delegate {
onReset();
}, onHalfOpen);
}
public static CircuitBreakerPolicy<TResult> CircuitBreaker<TResult>(this PolicyBuilder<TResult> policyBuilder, int handledEventsAllowedBeforeBreaking, TimeSpan durationOfBreak, Action<DelegateResult<TResult>, TimeSpan, Context> onBreak, Action<Context> onReset, Action onHalfOpen)
{
return policyBuilder.CircuitBreaker(handledEventsAllowedBeforeBreaking, durationOfBreak, delegate(DelegateResult<TResult> outcome, CircuitState state, TimeSpan timespan, Context context) {
onBreak(outcome, timespan, context);
}, onReset, onHalfOpen);
}
public static CircuitBreakerPolicy<TResult> CircuitBreaker<TResult>(this PolicyBuilder<TResult> policyBuilder, int handledEventsAllowedBeforeBreaking, TimeSpan durationOfBreak, Action<DelegateResult<TResult>, CircuitState, TimeSpan, Context> onBreak, Action<Context> onReset, Action onHalfOpen)
{
if (handledEventsAllowedBeforeBreaking <= 0)
throw new ArgumentOutOfRangeException("handledEventsAllowedBeforeBreaking", "Value must be greater than zero.");
if (durationOfBreak < TimeSpan.Zero)
throw new ArgumentOutOfRangeException("durationOfBreak", "Value must be greater than zero.");
if (onBreak == null)
throw new ArgumentNullException("onBreak");
if (onReset == null)
throw new ArgumentNullException("onReset");
if (onHalfOpen == null)
throw new ArgumentNullException("onHalfOpen");
ICircuitController<TResult> breakerController = (ICircuitController<TResult>)new ConsecutiveCountCircuitController<TResult>(handledEventsAllowedBeforeBreaking, durationOfBreak, onBreak, onReset, onHalfOpen);
return new CircuitBreakerPolicy<TResult>((Func<Func<Context, CancellationToken, TResult>, Context, CancellationToken, TResult>)((Func<Context, CancellationToken, TResult> action, Context context, CancellationToken cancellationToken) => CircuitBreakerEngine.Implementation<TResult>(action, context, cancellationToken, (IEnumerable<ExceptionPredicate>)policyBuilder.ExceptionPredicates, (IEnumerable<ResultPredicate<TResult>>)policyBuilder.ResultPredicates, (ICircuitController<TResult>)breakerController)), (IEnumerable<ExceptionPredicate>)policyBuilder.ExceptionPredicates, (IEnumerable<ResultPredicate<TResult>>)policyBuilder.ResultPredicates, (ICircuitController<TResult>)breakerController);
}
}
}