/// <summary>
        ///     Retry the message dispatch
        /// </summary>
        /// <typeparam name="TMessageType">Message type</typeparam>
        /// <param name="chainBuilder">The message handler chain builder.</param>
        /// <param name="maxNumberOfAttempts">The maximum number of attempts to try.</param>
        /// <param name="retryDelay">The delay between retries.</param>
        /// <returns>The MHC builder</returns>
        public static IChainBuilder <TMessageType> Retry <TMessageType>(
            this IChainBuilder <TMessageType> chainBuilder,
            int maxNumberOfAttempts,
            TimeSpan retryDelay)
        {
            var builder = new RetryDecoratorBuilder <TMessageType>().MaximumNumberOfAttempts(maxNumberOfAttempts).RetryDelays(retryDelay);

            return(chainBuilder.AddDecorator(nextHandler => new RetryDecorator <TMessageType>(nextHandler, builder).HandleMessageAsync));
        }
        /// <summary>
        ///     Retry the message dispatch
        /// </summary>
        /// <typeparam name="TMessageType">Message type</typeparam>
        /// <param name="chainBuilder">The message handler chain builder.</param>
        /// <param name="configureRetry">Metod called to configure the retry</param>
        /// <returns>The MHC builder</returns>
        public static IChainBuilder <TMessageType> Retry <TMessageType>(
            this IChainBuilder <TMessageType> chainBuilder,
            Action <IRetryDecoratorBuilder <TMessageType> > configureRetry)
        {
            if (configureRetry == null)
            {
                throw new ArgumentNullException(nameof(configureRetry));
            }

            var builder = new RetryDecoratorBuilder <TMessageType>();

            configureRetry(builder);

            return(chainBuilder.AddDecorator(nextHandler => new RetryDecorator <TMessageType>(nextHandler, builder).HandleMessageAsync));
        }