public void InitSuccessfulTransitionResult(string previousState, string attemptedTransition, string messageKey = null) { TransitionResult = new TransitionSuccessful { PreviousState = previousState, AttemptedTransition = attemptedTransition, MessageKey = messageKey, }; }
public void InitFailedTransitionResult(string previousState, string attemptedTransition, string messageKey = null, Exception exception = null) { TransitionResult = new TransitionFailed { PreviousState = previousState, AttemptedTransition = attemptedTransition, MessageKey = messageKey, Exception = exception, }; }
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, }; }
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); }
public void InitFailedTransitionResult(TransitionFailed result) { TransitionResult = result; }
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); } }