Beispiel #1
0
        public static IRollbackActionResult <TOut> Bind <TIn, TOut>(
            this IRollbackAction <TIn, TOut> action, IRollbackActionResult <TIn> parameter)
        {
            action.ThrowIfNull(nameof(action));
            parameter.ThrowIfNull(nameof(parameter));

            switch (parameter)
            {
            case FailedResult failedResult:
            {
                throw failedResult.Exception.Rethrow();
            }

            case SuccessfulResult <TIn> successfulResult:
            {
                try
                {
                    TOut result = action.Execute(successfulResult.Result);
                    return(new SuccessfulResult <TOut>(
                               result, successfulResult.RollbackList.Prepend(action)
                               ));
                }
                catch (Exception)
                {
                    successfulResult.RollbackList.TryRollbackSafe();
                    throw;
                }
            }

            default:
            {
                throw new ArgumentException("Invalid parameter.", nameof(parameter));
            }
            }
        }
Beispiel #2
0
 public static IRollbackActionResult <TOut> Bind <TIn, TOut>(
     this IRollbackAction <TIn, TOut> action, TIn parameter)
 {
     return(Bind(
                action, new SuccessfulResult <TIn>(parameter, Enumerable.Empty <IRollbackAction>())
                ));
 }
Beispiel #3
0
        public void Add(IRollbackAction rollbackAction)
        {
            rollbackAction.ThrowIfNull(nameof(rollbackAction));

            EnsureScopeIsNotDisposed(_disposed);

            _rollbackActions.Push(rollbackAction);
        }
Beispiel #4
0
        public void Add(IRollbackAction rollbackAction)
        {
            rollbackAction.ThrowIfNull(nameof(rollbackAction));

            if (_disposed)
            {
                throw new ObjectDisposedException(nameof(RollbackScope), "Failed to add action to disposed scope.");
            }

            _rollbackActions.Push(rollbackAction);
        }
Beispiel #5
0
        private bool TryRollbackInternalSafe(bool disposing)
        {
            if (_disposed)
            {
                Logger.Warning(
                    "Tried to rollback actions for disposed scope. Rollback will not be perform."
                    );
                return(false);
            }

            if (_rollbackActions.Count == 0)
            {
                Logger.Debug("No rollback actions to perform.");
                return(true);
            }

            string message =
                $"Performing {_rollbackActions.Count.ToString()} rollback actions. " +
                $"Continue rollback on failed: '{_continueRollbackOnFailed.ToString()}'.";

            if (disposing)
            {
                Logger.Warning(message);
            }
            else
            {
                Logger.Debug(message);
            }

            bool isSuccessfulRollback = true;

            while (ShouldContinueRollback(isSuccessfulRollback))
            {
                IRollbackAction rollbackAction = _rollbackActions.Pop();
                isSuccessfulRollback = InternalRollbackSafe(rollbackAction);
            }

            Logger.Debug(
                $"Scope remains {_rollbackActions.Count.ToString()} non-completed rollback " +
                "action. Some actions may failed."
                );
            _rollbackActions.TrimExcess();
            return(isSuccessfulRollback);
        }
Beispiel #6
0
        public bool TryRollbackSafe()
        {
            if (_disposed)
            {
                Logger.Warning("Tried to rollback actions for disposed scope. Rollback will not be perform.");
                return(false);
            }

            Logger.Warning($"Performing {_rollbackActions.Count.ToString()} rollback actions.");

            bool isSuccessfulRollback = true;

            while (_rollbackActions.Count > 0 && isSuccessfulRollback)
            {
                IRollbackAction rollbackAction = _rollbackActions.Pop();
                isSuccessfulRollback = rollbackAction.TryRollbackSafe();
            }

            _rollbackActions.TrimExcess();
            return(isSuccessfulRollback);
        }
Beispiel #7
0
        private bool InternalRollbackSafe(IRollbackAction rollbackAction)
        {
            try
            {
                Logger.Debug(
                    "Trying to rollback action. If exception will occur, this will be considered " +
                    "as a failed rollback."
                    );
                return(rollbackAction.TryRollbackSafe());
            }
            catch (Exception ex)
            {
                string lastPartOfMessage = _continueRollbackOnFailed
                    ? "Continue rollback on failed option is enabled, the rollback will continue."
                    : "Continue rollback on failed option is disabled, the rest of rollback " +
                                           "actions will be skipped.";

                Logger.Exception(
                    ex, $"Failed to perform safe rollback for action. {lastPartOfMessage}"
                    );
                return(false);
            }
        }
Beispiel #8
0
 public static IRollbackActionResult <TOut> Bind <TIn, TOut>(
     this IRollbackActionResult <TIn> parameter, IRollbackAction <TIn, TOut> action)
 {
     return(Bind(action, parameter));
 }