/// <summary> /// On workflow transition. /// </summary> /// <param name="transition"></param> protected virtual void OnTransitionAction(StateMachine <WorkflowState <T, TContext>, WorkflowTrigger <T> > .Transition transition) { // Find the states var sourceState = transition.Source; var destinationState = transition.Destination; if (sourceState == null) { throw new InvalidOperationException(string.Format("Unable to find the source state {0} in the list of available states.", transition.Source)); } if (destinationState == null) { throw new InvalidOperationException(string.Format("Unable to find the destination state {0} in the list of available states.", transition.Destination)); } // Find the trigger var trigger = transition.Trigger; if (trigger == null) { throw new InvalidOperationException(string.Format("Unable to find the trigger {0} in the list of available triggers.", transition.Trigger)); } var returnTransition = new WorkflowTransition <T, TContext>(sourceState, destinationState, trigger, transition.IsReentry); _onTransitionedEvent.Invoke(returnTransition); //Raise the event to the consumer OnStateTransition?.Invoke(sourceState, destinationState, trigger, transition.IsReentry); }
public async Task InvokeAsync(WorkflowTransition <T, TContext> transition) { _onTransitioned?.Invoke(transition); foreach (var callback in _onTransitionedAsync) { await callback(transition); } }
public void Invoke(WorkflowTransition <T, TContext> transition) { if (_onTransitionedAsync.Count != 0) { throw new InvalidOperationException( "Cannot execute asynchronous action specified as OnTransitioned callback. " + "Use asynchronous version of Fire [FireAsync]"); } _onTransitioned?.Invoke(transition); }
/// <summary> /// Executes workflow combined actions /// </summary> /// <param name="workflow"></param> /// <param name="transition"></param> public void Execute(IWorkflow <T, TContext> workflow, WorkflowTransition <T, TContext> transition) { foreach (var action in actions) { try { action.Execute(workflow, transition); } catch (Exception ex) { throw new WorkflowActionException($"Unable to execute action {action.GetType()}", ex); } } }
/// <summary> /// Execute IActions based on the workflow definition /// </summary> /// <param name="transition"></param> /// <param name="entryAction"></param> private void ExecuteAction(StateMachine <WorkflowState <T, TContext>, WorkflowTrigger <T> > .Transition transition, IAction <T, TContext> entryAction) { if (entryAction == null) { return; } WorkflowTransition <T, TContext> wt = null; if (transition != null) { wt = new WorkflowTransition <T, TContext>(transition.Source, transition.Destination, transition.Trigger, transition.IsReentry); } entryAction.Execute(this, wt); }
/// <summary> /// Not implemented yet /// </summary> /// <param name="workflow"></param> /// <param name="transition"></param> public async Task ExecuteAsync(IWorkflow <T, TContext> workflow, WorkflowTransition <T, TContext> transition) { //TODO: implement async throw new NotImplementedException(); }