//----------------------------------------------------------------------------------------------------------------------------------------------------- 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; } }
//----------------------------------------------------------------------------------------------------------------------------------------------------- public RevertableSequence(IRevertableSequenceCodeBehind codeBehind) { _codeBehind = codeBehind; _stepBuilders = new List <StepBuilder>(); _performedSteps = new Stack <Step>(); _state = RevertableSequenceState.NotPerformed; _codeBehind.BuildSequence(this); }
//----------------------------------------------------------------------------------------------------------------------------------------------------- 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); } }