Ejemplo n.º 1
0
        /// <summary>
        /// Adds a circuit breaker bot with a custom strategy implementation to a <see cref="IBotPolicy"/>.
        /// </summary>
        /// <param name="builder">The policy builder.</param>
        /// <param name="configuratorAction">The bots configurator action.</param>
        /// <param name="strategyFactory">The custom circuit breaker strategy factory delegate.</param>
        /// <returns>The policy builder.</returns>
        /// <example>
        /// <code>
        /// builder.CircuitBreaker(switcher => new CustomCircuitBreakerStrategy(switcher),
        ///     config => config
        ///         .BrakeWhenExceptionOccurs(exception => exception is HttpRequestException)
        ///         .OnClosed(() => onClosedAction())
        ///         .OnHalfOpen(() => onHalfOpenAction())
        ///         .OnOpen(openDuration => onOpenAction(openDuration)));
        /// </code>
        /// </example>
        public static IBotPolicyBuilder CustomCircuitBreaker(this IBotPolicyBuilder builder,
                                                             Func <CircuitBreakerConfiguration, CircuitBreakerStrategy> strategyFactory, Action <CircuitBreakerConfiguration> configuratorAction)
        {
            Shield.EnsureNotNull(configuratorAction, nameof(configuratorAction));
            Shield.EnsureNotNull(strategyFactory, nameof(strategyFactory));

            return(builder.AddBot((innerBot, config) => new CircuitBreakerBot(innerBot, config, strategyFactory(config)), configuratorAction));
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Adds a circuit breaker bot to a <see cref="IBotPolicy"/> with the given configuration.
        /// </summary>
        /// <param name="builder">The policy builder.</param>
        /// <param name="configuration">The bots configuraton.</param>
        /// <param name="strategyConfiguration">The circuit breakers configuraton.</param>
        /// <returns>The policy builder.</returns>
        /// <example>
        /// <code>
        /// builder.CircuitBreaker(new CircuitBreakerConfiguration()
        ///         .BrakeWhenExceptionOccurs(exception => exception is HttpRequestException)
        ///         .OnClosed(() => onClosedAction())
        ///         .OnHalfOpen(() => onHalfOpenAction())
        ///         .OnOpen(openDuration => onOpenAction(openDuration)),
        ///             new DefaultCircuitBreakerStrategyConfiguration()
        ///                 .DurationOfOpen(TimeSpan.FromSeconds(15))
        ///                 .FailureThresholdBeforeOpen(5)
        ///                 .SuccessThresholdInHalfOpen(2));
        /// </code>
        /// </example>
        public static IBotPolicyBuilder CircuitBreaker(this IBotPolicyBuilder builder,
                                                       CircuitBreakerConfiguration configuration, DefaultCircuitBreakerStrategyConfiguration strategyConfiguration)
        {
            Shield.EnsureNotNull(configuration, nameof(configuration));
            Shield.EnsureNotNull(strategyConfiguration, nameof(strategyConfiguration));

            return(builder.AddBot((innerBot, config) => new CircuitBreakerBot(innerBot, config,
                                                                              new DefaultCircuitBreakerStrategy(config, strategyConfiguration)), configuration));
        }
Ejemplo n.º 3
0
        /// <summary>
        /// Adds a circuit breaker bot to a <see cref="IBotPolicy"/> with the given configuration.
        /// </summary>
        /// <param name="builder">The policy builder.</param>
        /// <param name="configuratorAction">The bots configurator action.</param>
        /// <param name="strategyConfiguration">The circuit breakers configurator action.</param>
        /// <returns>The policy builder.</returns>
        /// <example>
        /// <code>
        /// builder.CircuitBreaker(config => config
        ///         .BrakeWhenExceptionOccurs(exception => exception is HttpRequestException)
        ///         .OnClosed(() => onClosedAction())
        ///         .OnHalfOpen(() => onHalfOpenAction())
        ///         .OnOpen(openDuration => onOpenAction(openDuration)),
        ///             strategyConfig => strategyConfig
        ///                 .DurationOfOpen(TimeSpan.FromSeconds(15))
        ///                 .FailureThresholdBeforeOpen(5)
        ///                 .SuccessThresholdInHalfOpen(2));
        /// </code>
        /// </example>
        public static IBotPolicyBuilder CircuitBreaker(this IBotPolicyBuilder builder,
                                                       Action <CircuitBreakerConfiguration> configuratorAction, Action <DefaultCircuitBreakerStrategyConfiguration> strategyConfiguration)
        {
            Shield.EnsureNotNull(configuratorAction, nameof(configuratorAction));
            Shield.EnsureNotNull(strategyConfiguration, nameof(strategyConfiguration));

            var strategyConfig = new DefaultCircuitBreakerStrategyConfiguration();

            strategyConfiguration?.Invoke(strategyConfig);
            return(builder.AddBot((innerBot, config) => new CircuitBreakerBot(innerBot, config,
                                                                              new DefaultCircuitBreakerStrategy(config, strategyConfig)), configuratorAction));
        }
Ejemplo n.º 4
0
        /// <summary>
        /// Adds a retry bot to a <see cref="IBotPolicy"/> with the given configuration.
        /// </summary>
        /// <typeparam name="TResult">The result type of the passed operation.</typeparam>
        /// <param name="builder">The policy builder.</param>
        /// <param name="configuration">The configuraton.</param>
        /// <returns>The policy builder.</returns>
        /// <example>
        /// <code>
        /// builder.Retry(new RetryConfiguration()
        ///     .WhenExceptionOccurs(exception => exception is HttpRequestException)
        ///     .WhenResultIs(result => result != OperationResult.Ok)
        ///     .WithMaxAttemptCount(5)
        ///     .WaitBetweenAttempts((attempt, result, exception) =>
        ///         TimeSpan.FromSeconds(Math.Pow(2, attempt)))
        ///     .OnRetry((exception, result, context) => Log($"{context.CurrentAttempt}. attempt, wait {context.CurrentDelay}")))
        /// </code>
        /// </example>
        public static IBotPolicyBuilder <TResult> Retry <TResult>(this IBotPolicyBuilder <TResult> builder, RetryConfiguration <TResult> configuration)
        {
            Shield.EnsureNotNull(configuration, nameof(configuration));

            return(builder.AddBot((innerBot, retryConfig) => new RetryBot <TResult>(innerBot, retryConfig), configuration));
        }
Ejemplo n.º 5
0
        /// <summary>
        /// Adds a retry bot to a <see cref="IBotPolicy"/> with the given configuration.
        /// </summary>
        /// <param name="builder">The policy builder.</param>
        /// <param name="configuratorAction">The configurator action.</param>
        /// <returns>The policy builder.</returns>
        /// <example>
        /// <code>
        /// builder.Retry(config => config
        ///     .WhenExceptionOccurs(exception => exception is HttpRequestException)
        ///     .WithMaxAttemptCount(5)
        ///     .WaitBetweenAttempts((attempt, exception) =>
        ///         TimeSpan.FromSeconds(Math.Pow(2, attempt)))
        ///     .OnRetry((exception, context) => Log($"{context.CurrentAttempt}. attempt, wait {context.CurrentDelay}")))
        /// </code>
        /// </example>
        public static IBotPolicyBuilder Retry(this IBotPolicyBuilder builder, Action <RetryConfiguration> configuratorAction)
        {
            Shield.EnsureNotNull(configuratorAction, nameof(configuratorAction));

            return(builder.AddBot((innerBot, retryConfig) => new RetryBot(innerBot, retryConfig), configuratorAction));
        }
Ejemplo n.º 6
0
        /// <summary>
        /// Adds a fallback bot to a <see cref="IBotPolicy"/> with the given configuration.
        /// </summary>
        /// <param name="builder">The policy builder.</param>
        /// <param name="configuration">The configuraton.</param>
        /// <returns>The policy builder.</returns>
        /// <example>
        /// <code>
        /// builder.Fallback(new FallbackConfiguration()
        ///     .WhenExceptionOccurs(exception => exception is HttpRequestException)
        ///     .WhenResultIs(result => result != OperationResult.Ok)
        ///     .OnFallback((exception, context) => onFallbackAction()))
        /// </code>
        /// </example>
        public static IBotPolicyBuilder <TResult> Fallback <TResult>(this IBotPolicyBuilder <TResult> builder, FallbackConfiguration <TResult> configuration)
        {
            Shield.EnsureNotNull(configuration, nameof(configuration));

            return(builder.AddBot((innerBot, config) => new FallbackBot <TResult>(innerBot, config), configuration));
        }
Ejemplo n.º 7
0
        /// <summary>
        /// Adds a fallback bot to a <see cref="IBotPolicy"/> with the given configuration.
        /// </summary>
        /// <param name="builder">The policy builder.</param>
        /// <param name="configuration">The configuraton.</param>
        /// <returns>The policy builder.</returns>
        /// <example>
        /// <code>
        /// builder.Fallback(new FallbackConfiguration()
        ///     .WhenExceptionOccurs(exception => exception is HttpRequestException)
        ///     .OnFallback((exception, context) => onFallbackAction()))
        /// </code>
        /// </example>
        public static IBotPolicyBuilder Fallback(this IBotPolicyBuilder builder, FallbackConfiguration configuration)
        {
            Shield.EnsureNotNull(configuration, nameof(configuration));

            return(builder.AddBot((innerBot, config) => new FallbackBot(innerBot, config), configuration));
        }
Ejemplo n.º 8
0
        /// <summary>
        /// Adds a rate limiter bot to a <see cref="IBotPolicy"/> with the given configuration.
        /// </summary>
        /// <typeparam name="TResult">The result type of the passed operation.</typeparam>
        /// <param name="builder">The policy builder.</param>
        /// <param name="configuratorAction">The configurator action.</param>
        /// <returns>The policy builder.</returns>
        /// <example>
        /// <code>
        /// builder.RateLimit(config => config
        ///     .MaxAmountOfAllowedOperations(10)
        ///     .WithinTimeInterval(TimeSpan.FromSeconds(5))
        ///     .UseStrategy(RateLimiterStrategy.SlidingWindow))
        /// </code>
        /// </example>
        public static IBotPolicyBuilder <TResult> RateLimit <TResult>(this IBotPolicyBuilder <TResult> builder, Action <RateLimiterConfiguration> configuratorAction)
        {
            Shield.EnsureNotNull(configuratorAction, nameof(configuratorAction));

            return(builder.AddBot((innerBot, rateLimitConfig) => new RateLimiterBot <TResult>(innerBot, rateLimitConfig), configuratorAction));
        }
Ejemplo n.º 9
0
        /// <summary>
        /// Adds a rate limiter bot to a <see cref="IBotPolicy"/> with the given configuration.
        /// </summary>
        /// <param name="builder">The policy builder.</param>
        /// <param name="configuration">The configuraton.</param>
        /// <returns>The policy builder.</returns>
        /// <example>
        /// <code>
        /// builder.RateLimit(new RateLimiterConfiguration()
        ///     .MaxAmountOfAllowedOperations(10)
        ///     .WithinTimeInterval(TimeSpan.FromSeconds(5))
        ///     .UseStrategy(RateLimiterStrategy.SlidingWindow))
        /// </code>
        /// </example>
        public static IBotPolicyBuilder RateLimit(this IBotPolicyBuilder builder, RateLimiterConfiguration configuration)
        {
            Shield.EnsureNotNull(configuration, nameof(configuration));

            return(builder.AddBot((innerBot, rateLimitConfig) => new RateLimiterBot(innerBot, rateLimitConfig), configuration));
        }
Ejemplo n.º 10
0
 /// <summary>
 /// Adds a Passthrough bot to a <see cref="IBotPolicy"/> with the given configuration.
 /// This bot has a really simple purpose, it only proxies the given operation to its nested bot.
 /// </summary>
 /// <typeparam name="TResult">The result type of the passed operation.</typeparam>
 /// <param name="builder">The policy builder.</param>
 /// <returns>The policy builder.</returns>
 public static IBotPolicyBuilder <TResult> Passthrough <TResult>(this IBotPolicyBuilder <TResult> builder) =>
 builder.AddBot(innerBot => new PassthroughBot <TResult>(innerBot));
Ejemplo n.º 11
0
 /// <summary>
 /// Adds a Passthrough bot to a <see cref="IBotPolicy"/> with the given configuration.
 /// This bot has a really simple purpose, it only proxies the given operation to its nested bot.
 /// </summary>
 /// <param name="builder">The policy builder.</param>
 /// <returns>The policy builder.</returns>
 public static IBotPolicyBuilder Passthrough(this IBotPolicyBuilder builder) =>
 builder.AddBot(innerBot => new PassthroughBot(innerBot));
Ejemplo n.º 12
0
        /// <summary>
        /// Adds a timeout bot to a <see cref="IBotPolicy"/> with the given configuration.
        /// </summary>
        /// <typeparam name="TResult">The result type of the passed operation.</typeparam>
        /// <param name="builder">The policy builder.</param>
        /// <param name="configuration">The configuraton.</param>
        /// <returns>The policy builder.</returns>
        /// <example>
        /// <code>
        /// builder.Timeout(
        ///     new TimeoutConfiguration()
        ///         .After(TimeSpan.FromSeconds(15))
        ///         .OnTimeout(context => timeoutAction()));
        /// </code>
        /// </example>
        public static IBotPolicyBuilder <TResult> Timeout <TResult>(this IBotPolicyBuilder <TResult> builder, TimeoutConfiguration configuration)
        {
            Shield.EnsureNotNull(configuration, nameof(configuration));

            return(builder.AddBot((innerBot, config) => new TimeoutBot <TResult>(innerBot, config), configuration));
        }
Ejemplo n.º 13
0
        /// <summary>
        /// Adds a timeout bot to a <see cref="IBotPolicy"/> with the given configuration.
        /// </summary>
        /// <param name="builder">The policy builder.</param>
        /// <param name="configuratorAction">The configurator action.</param>
        /// <returns>The policy builder.</returns>
        /// <example>
        /// <code>
        /// builder.Timeout(config =>
        ///     config.After(TimeSpan.FromSeconds(15))
        ///           .OnTimeout(context => timeoutAction()));
        /// </code>
        /// </example>
        public static IBotPolicyBuilder Timeout(this IBotPolicyBuilder builder, Action <TimeoutConfiguration> configuratorAction)
        {
            Shield.EnsureNotNull(configuratorAction, nameof(configuratorAction));

            return(builder.AddBot((innerBot, config) => new TimeoutBot(innerBot, config), configuratorAction));
        }