Exemplo n.º 1
0
 public void InitSuccessfulTransitionResult(string previousState, string attemptedTransition, string messageKey = null)
 {
     TransitionResult = new TransitionSuccessful
     {
         PreviousState       = previousState,
         AttemptedTransition = attemptedTransition,
         MessageKey          = messageKey,
     };
 }
Exemplo n.º 2
0
 public void InitFailedTransitionResult(string previousState, string attemptedTransition, string messageKey = null, Exception exception = null)
 {
     TransitionResult = new TransitionFailed
     {
         PreviousState       = previousState,
         AttemptedTransition = attemptedTransition,
         MessageKey          = messageKey,
         Exception           = exception,
     };
 }
Exemplo n.º 3
0
        public void InitSuccessfulTransitionResult(TState previousState, Expression <Func <TState, TState> > attemptedTransition, string messageKey = null)
        {
            var body = attemptedTransition?.Body as MethodCallExpression;

            TransitionResult = new TransitionSuccessful
            {
                PreviousState       = previousState.GetType().Name,
                AttemptedTransition = body?.Method.Name ?? "",
                MessageKey          = messageKey,
            };
        }
Exemplo n.º 4
0
        public void InitFailedTransitionResult(TState previousState, Expression <Func <TState, TState> > attemptedTransition,
                                               TransitionValidationFailed transitionValidationFailed)
        {
            var body = attemptedTransition?.Body as MethodCallExpression;

            TransitionResult = new TransitionFailed
            {
                PreviousState       = previousState.GetType().Name,
                AttemptedTransition = body?.Method.Name ?? "",
                MessageKey          = transitionValidationFailed.MessageKey,
            };
            TransitionResult.AddMessageArgs(transitionValidationFailed.MessageArgs);
        }
Exemplo n.º 5
0
 public void InitFailedTransitionResult(TransitionFailed result)
 {
     TransitionResult = result;
 }
Exemplo n.º 6
0
 public void InitSuccessfulTransitionResult(TransitionSuccessful result)
 {
     TransitionResult = result;
 }
        public async Task <TState> Execute()
        {
            var previousState = StatedEntity.State;

            if (TransitionToInvoke == null)
            {
                throw new TransitionNotSpecifiedException();
            }

            try
            {
                var transition = GetRequestedTransition;
                IStateHandler <TEntity> transitionHandler = transition?.OnTransitioning?.Invoke();

                var validationResult = await IsPreconditionOk().ConfigureAwait(false);

                if (validationResult is TransitionValidationFailed failedResult && transitionHandler != null)
                {
                    StatedEntity.State.InitFailedTransitionResult(
                        previousState,
                        TransitionToInvoke,
                        failedResult);

                    if (transitionHandler is IPrevalidation <TEntity> pv)
                    {
                        await pv.OnValidationFailed(StatedEntity, failedResult).ConfigureAwait(false);
                    }
                    return(StatedEntity.State);
                }

                ITransitionExecutionResult transitionResult = null;
                Exception transitionException = null;

                if (transition.OnTransitioning != null)
                {
                    try
                    {
                        transitionHandler = transition.OnTransitioning.Invoke();
                        if (transitionHandler is IBeforeTransition <TEntity> bth)
                        {
                            await bth.OnPrepareTransition(StatedEntity).ConfigureAwait(false);
                        }
                        transitionResult = await transitionHandler.ExecuteTransition(StatedEntity).ConfigureAwait(false);
                    }
                    catch (Exception e)
                    {
                        transitionException    = e;
                        IsTransitionSuccessful = false;
                        transitionResult       = CreateFailedResult(previousState, TransitionToInvoke, "TransitionFailed", e);
                    }
                }

                if (transitionResult is TransitionSuccessful successfulResult)
                {
                    StatedEntity.State = transition.StateTransitionOnSuccess.Compile()(StatedEntity.State);
                    if (transitionHandler is IAfterSuccessfulTransition <TEntity> ast)
                    {
                        await ast.OnSuccessfulTransition(StatedEntity, successfulResult).ConfigureAwait(false);
                    }

                    StatedEntity.State.InitSuccessfulTransitionResult(successfulResult);
                    ActionOnSuccess?.Invoke(StatedEntity, StatedEntity.State);
                    await StateEngine.NotifyStateChange(StatedEntity).ConfigureAwait(false);

                    return(StatedEntity.State);
                }

                if (transitionHandler is IAfterFailedTransition <TEntity> aft)
                {
                    await aft.OnFailedTransition(StatedEntity, transitionResult as TransitionFailed).ConfigureAwait(false);
                }

                if (transition.OnTransitionFailed == null)
                {
                    throw new TransitionFailedException(transition.StateTransitionOnSuccess.TransitionName <TState, TStateEnum>(),
                                                        $"{previousState}", transitionException);
                }

                throw new TransitionRollbackFailedException(
                          transition.StateTransitionOnFailed?.TransitionName <TState, TStateEnum>()
                          ?? "[rollback undefined]", $"{previousState}", transitionException);
            }
            catch (Exception ex)
            {
                StatedEntity.State.InitFailedTransitionResult(previousState, TransitionToInvoke, "TransitionExecutionFailed", ex);
                StatedEntity.State.TransitionResult.AddMessageArg("", "");
                ActionOnError?.Invoke(StatedEntity, StatedEntity.State);
                return(StatedEntity.State);
            }
        }