示例#1
0
        //-----------------------------------------------------------------------------------------------------------------------------------------------------

        public void Perform()
        {
            _performedSteps.Clear();

            try
            {
                foreach (var builder in _stepBuilders)
                {
                    var steps = builder.GetSteps();

                    foreach (var step in steps)
                    {
                        step.Perform();
                        _performedSteps.Push(step);
                    }
                }

                _state = RevertableSequenceState.Performed;
            }
            catch (Exception performException)
            {
                try
                {
                    Revert();
                }
                catch (Exception revertException)
                {
                    _state = RevertableSequenceState.RevertFailed;
                    throw new AggregateException(performException, revertException).Flatten();
                }

                throw;
            }
        }
示例#2
0
        //-----------------------------------------------------------------------------------------------------------------------------------------------------

        public RevertableSequence(IRevertableSequenceCodeBehind codeBehind)
        {
            _codeBehind     = codeBehind;
            _stepBuilders   = new List <StepBuilder>();
            _performedSteps = new Stack <Step>();
            _state          = RevertableSequenceState.NotPerformed;

            _codeBehind.BuildSequence(this);
        }
示例#3
0
        //-----------------------------------------------------------------------------------------------------------------------------------------------------

        public void Revert()
        {
            var revertExceptions    = new List <Exception>();
            var stepsFailedToRevert = new Stack <Step>();

            while (_performedSteps.Count > 0) // LIFO loop
            {
                var step = _performedSteps.Pop();

                try
                {
                    step.Revert();
                }
                catch (Exception e)
                {
                    revertExceptions.Add(e);
                    stepsFailedToRevert.Push(step);
                }
            }

            if (revertExceptions.Count == 0)
            {
                _state = RevertableSequenceState.Reverted;
            }
            else
            {
                _state = RevertableSequenceState.RevertFailed;

                foreach (var step in stepsFailedToRevert)
                {
                    _performedSteps.Push(step);
                }

                throw new AggregateException(revertExceptions);
            }
        }