private void ProcessAmountLessThanOrEquals20(int paymentId)
        {
            var results = RetryMechanism.RetryWithSame(() => _cheapPaymentGateway.ProcessPayment(paymentId), 0);

            if (!results)
            {
                ProcessFailedPayment(paymentId);
            }
        }
        private void ProcessAmountGreaterThan500(int paymentId)
        {
            var results = RetryMechanism.RetryWithSame(() =>
                                                       _expensivePaymentGateway.ProcessPayment(paymentId), 3);

            if (!results)
            {
                ProcessFailedPayment(paymentId);
            }
        }
        private void ProcessAmountGreaterThan20AndLessThanEqualTo500(int paymentId)
        {
            var results = RetryMechanism.RetryWithAlternate(() =>
                                                            _expensivePaymentGateway.ProcessPayment(paymentId),
                                                            () =>
                                                            _cheapPaymentGateway.ProcessPayment(paymentId));

            if (!results)
            {
                ProcessFailedPayment(paymentId);
            }
        }
        public override IGateway Execute(decimal ammount)
        {
            IGateway gateway;

            if (ammount > 21 && ammount < 500)
            {
                gateway = RandomlyReturnInstanceOrNull <ExpensivePaymentGateway>();
                if (gateway == null)
                {
                    gateway = RetryMechanism.Do(RandomlyReturnInstanceOrNull <CheapPaymentGateway>, TimeSpan.FromSeconds(1), 1);
                }

                return(gateway);
            }

            return(base.Execute(ammount));
        }