protected virtual bool Visit <TInstance>(TransitionActivity <TInstance> activity) where TInstance : class { Trace.WriteLine("({0})[{1}] ==> ({2})".FormatWith(activity.State, activity.Event, activity.TargetState)); return(true); }
public InitialIfNullStateAccessor(State <TInstance> initialState, StateAccessor <TInstance> stateAccessor) { _stateAccessor = stateAccessor; Activity <TInstance> initialActivity = new TransitionActivity <TInstance>(initialState, _stateAccessor); _initialBehavior = new LastBehavior <TInstance>(initialActivity); }
/// <summary> /// Transition a state machine instance to a specific state, producing any events related /// to the transaction such as leaving the previous state and entering the target state /// </summary> /// <typeparam name="TInstance">The state instance type</typeparam> /// <param name="composer"></param> /// <param name="instance">The state instance</param> /// <param name="accessor"></param> /// <param name="state">The target state</param> public static void TransitionToState <TInstance>(Composer composer, TInstance instance, StateAccessor <TInstance> accessor, State <TInstance> state) where TInstance : class { Activity <TInstance> activity = new TransitionActivity <TInstance>(state, accessor); activity.Execute(composer, instance); }
/// <summary> /// Transition the state machine to the Final state /// </summary> public static EventActivityBinder <TInstance> Finalize <TInstance>(this EventActivityBinder <TInstance> source) where TInstance : class { var state = source.StateMachine.GetState(source.StateMachine.Final.Name); var activity = new TransitionActivity <TInstance>(state, source.StateMachine.Accessor); return(source.Add(activity)); }
/// <summary> /// Transition the state machine to the specified state /// </summary> public static EventActivityBinder <TInstance> TransitionTo <TInstance>(this EventActivityBinder <TInstance> source, State toState) where TInstance : class { State <TInstance> state = source.StateMachine.GetState(toState.Name); var activity = new TransitionActivity <TInstance>(state, source.StateMachine.Accessor); return(source.Add(activity)); }
public void Configure(ActivityBuilder <TWorkflow, TInstance> builder) { StateMachineState <TInstance> targetState = _getTargetState(builder.Model); var activity = new TransitionActivity <TInstance>(builder.Model.CurrentStateAccessor, builder.State, builder.Event, targetState); builder.AddActivity(activity); }
/// <summary> /// Transition the state machine to the Completed state /// </summary> public static EventActivityBinder <TInstance, TData> Finalize <TInstance, TData>( this EventActivityBinder <TInstance, TData> source) where TInstance : class { State <TInstance> state = source.StateMachine.Final.For <TInstance>(); var activity = new TransitionActivity <TInstance>(state, source.StateMachine.InstanceStateAccessor); return(source.Add(activity)); }
/// <summary> /// Transition the state machine to the Final state /// </summary> public static ExceptionActivityBinder <TInstance, TData, TException> Finalize <TInstance, TData, TException>( this ExceptionActivityBinder <TInstance, TData, TException> source) where TInstance : class where TException : Exception { State <TInstance> state = source.StateMachine.GetState(source.StateMachine.Final.Name); var activity = new TransitionActivity <TInstance>(state, source.StateMachine.Accessor); return(source.Add(activity)); }
/// <summary> /// Transition the state machine to the specified state in response to an exception /// </summary> /// <typeparam name="TInstance"></typeparam> /// <typeparam name="TException"></typeparam> /// <param name="source"></param> /// <param name="toState"></param> /// <returns></returns> public static ExceptionActivityBinder <TInstance, TException> TransitionTo <TInstance, TException>( this ExceptionActivityBinder <TInstance, TException> source, State toState) where TInstance : class where TException : Exception { State <TInstance> state = source.StateMachine.GetState(toState.Name); var activity = new TransitionActivity <TInstance>(state, source.StateMachine.Accessor); var compensateActivity = new ExecuteOnFaultedActivity <TInstance>(activity); return(source.Add(compensateActivity)); }
/// <summary> /// Transition a state machine instance to a specific state, producing any events related /// to the transaction such as leaving the previous state and entering the target state /// </summary> /// <typeparam name="TInstance">The state instance type</typeparam> /// <param name="machine">The state machine</param> /// <param name="instance">The state instance</param> /// <param name="state">The target state</param> /// <param name="cancellationToken"></param> public static Task TransitionToState <TInstance>(this StateMachine <TInstance> machine, TInstance instance, State state, CancellationToken cancellationToken = default) where TInstance : class { var accessor = machine.Accessor; var toState = machine.GetState(state.Name); Activity <TInstance> activity = new TransitionActivity <TInstance>(toState, accessor); Behavior <TInstance> behavior = new LastBehavior <TInstance>(activity); var eventContext = new StateMachineEventContext <TInstance>(machine, instance, toState.Enter, cancellationToken); BehaviorContext <TInstance> behaviorContext = new EventBehaviorContext <TInstance>(eventContext); return(behavior.Execute(behaviorContext)); }
// void InspectExceptionActivity(ExceptionActivity<TInstance> exceptionActivity, Action<Activity> next) // { // Vertex previousEvent = _currentEvent; // // _currentEvent = GetEventVertex(exceptionActivity.Event); // // _edges.Add(new Edge(previousEvent, _currentEvent, _currentEvent.Title)); // // next(exceptionActivity); // // _currentEvent = previousEvent; // } // void InspectTryActivity(TryActivity<TInstance> exceptionActivity, Action<Activity> next) // { // Vertex previousEvent = _currentEvent; // // next(exceptionActivity); // // _currentEvent = previousEvent; // } void InspectTransitionActivity(TransitionActivity <TInstance> transitionActivity) { Vertex targetState = GetStateVertex(transitionActivity.ToState); _edges.Add(new Edge(_currentEvent, targetState, _currentEvent.Title)); }
public bool UpdateTransitions(int ProcessID, List <TransitionDTO> list, string flowSTR) { try { //مهم و پیچیده نسبتا؟ اگر از جریان کار استفاده شده باشد امکان تغییر جریان کار بررسی شود using (var projectContext = new MyProjectEntities()) { var dbProcess = projectContext.Process.FirstOrDefault(x => x.ID == ProcessID); dbProcess.TransitionFlowSTR = flowSTR; var existingTransitions = list.Where(x => x.ID != 0).Select(x => x.ID).ToList(); var listRemove = dbProcess.Transition.Where(x => !existingTransitions.Contains(x.ID)); foreach (var item in listRemove.ToList()) { while (item.TransitionActivity.Any()) { projectContext.TransitionActivity.Remove(item.TransitionActivity.First()); } while (item.TransitionAction.Any()) { while (item.TransitionAction.First().TransitionAction_EntityGroup.Any()) { projectContext.TransitionAction_EntityGroup.Remove(item.TransitionAction.First().TransitionAction_EntityGroup.First()); } while (item.TransitionAction.First().TransitionAction_Formula.Any()) { projectContext.TransitionAction_Formula.Remove(item.TransitionAction.First().TransitionAction_Formula.First()); } while (item.TransitionAction.First().TransitionActionTarget.Any()) { projectContext.TransitionActionTarget.Remove(item.TransitionAction.First().TransitionActionTarget.First()); } projectContext.TransitionAction.Remove(item.TransitionAction.First()); } //item.TransitionAction.Clear(); //item.TransitionActivity.Clear(); projectContext.Transition.Remove(item); } foreach (var message in list) { Transition dbTransition = null; if (message.ID == 0) { dbTransition = new Transition(); projectContext.Transition.Add(dbTransition); } else { dbTransition = projectContext.Transition.FirstOrDefault(x => x.ID == message.ID); } dbTransition.CurrentStateID = message.CurrentStateID; dbTransition.ProcessID = message.ProcessID; dbTransition.NextStateID = message.NextStateID; dbTransition.Name = message.Name; List <TransitionActivity> removeActivity = new List <TransitionActivity>(); foreach (var dbActivity in dbTransition.TransitionActivity) { if (!message.TransitionActivities.Any(x => x.ID == dbActivity.ActivityID)) { removeActivity.Add(dbActivity); } } foreach (var citem in removeActivity) { projectContext.TransitionActivity.Remove(citem); } foreach (var msgActivity in message.TransitionActivities) { TransitionActivity dbTransitionActivity = null; if (!dbTransition.TransitionActivity.Any(x => msgActivity.ID != 0 && x.ActivityID == msgActivity.ID)) { dbTransitionActivity = new TransitionActivity(); dbTransition.TransitionActivity.Add(dbTransitionActivity); } else { dbTransitionActivity = dbTransition.TransitionActivity.FirstOrDefault(x => x.ActivityID == msgActivity.ID); } dbTransitionActivity.ActivityID = msgActivity.ID; } List <TransitionAction> removeAction = new List <TransitionAction>(); foreach (var dbAction in dbTransition.TransitionAction) { if (!message.TransitionActions.Any(x => x.ID == dbAction.ID)) { removeAction.Add(dbAction); } } foreach (var citem in removeAction) { while (citem.TransitionAction_EntityGroup.Any()) { projectContext.TransitionAction_EntityGroup.Remove(citem.TransitionAction_EntityGroup.First()); } while (citem.TransitionAction_Formula.Any()) { projectContext.TransitionAction_Formula.Remove(citem.TransitionAction_Formula.First()); } while (citem.TransitionActionTarget.Any()) { projectContext.TransitionActionTarget.Remove(citem.TransitionActionTarget.First()); } projectContext.TransitionAction.Remove(citem); } foreach (var msgTransitionAction in message.TransitionActions) { TransitionAction dbTransitionAction = null; if (!dbTransition.TransitionAction.Any(x => msgTransitionAction.ID != 0 && x.ID == msgTransitionAction.ID)) { dbTransitionAction = new TransitionAction(); dbTransition.TransitionAction.Add(dbTransitionAction); } else { dbTransitionAction = dbTransition.TransitionAction.FirstOrDefault(x => x.ID == msgTransitionAction.ID); } dbTransitionAction.ActionTypeID = (short)msgTransitionAction.ActionType; dbTransitionAction.MultipleUserEnabled = msgTransitionAction.MultipleUserEnabled; dbTransitionAction.Name = msgTransitionAction.Name; List <TransitionActionTarget> removeTransitionActionTarget = new List <TransitionActionTarget>(); foreach (var dbTransitionAction_Target in dbTransitionAction.TransitionActionTarget) { if (!msgTransitionAction.Targets.Any(x => x.ID == dbTransitionAction_Target.ID)) { removeTransitionActionTarget.Add(dbTransitionAction_Target); } } foreach (var citem in removeTransitionActionTarget) { projectContext.TransitionActionTarget.Remove(citem); } foreach (var item in msgTransitionAction.Targets) { TransitionActionTarget dbTransitionActionTarget = dbTransitionAction.TransitionActionTarget.FirstOrDefault(x => item.ID != 0 && x.ID == item.ID); if (dbTransitionActionTarget == null) { dbTransitionActionTarget = new TransitionActionTarget(); dbTransitionAction.TransitionActionTarget.Add(dbTransitionActionTarget); } dbTransitionActionTarget.TargetType = (Int16)item.TargetType; // dbTransitionActionTarget.CanSendOtherOrganizations = item.CanSendOtherOrganizations; if (dbTransitionActionTarget.RoleTypeID != 0) { dbTransitionActionTarget.RoleTypeID = item.RoleTypeID; } else { dbTransitionActionTarget.RoleTypeID = null; } } List <TransitionAction_Formula> removeTransitionAction_Formula = new List <TransitionAction_Formula>(); foreach (var dbTransitionAction_Formula in dbTransitionAction.TransitionAction_Formula) { if (!msgTransitionAction.Formulas.Any(x => x.FormulaID == dbTransitionAction_Formula.FormulaID)) { removeTransitionAction_Formula.Add(dbTransitionAction_Formula); } } foreach (var citem in removeTransitionAction_Formula) { projectContext.TransitionAction_Formula.Remove(citem); } foreach (var item in msgTransitionAction.Formulas) { TransitionAction_Formula dbTransitionAction_Formula = dbTransitionAction.TransitionAction_Formula.FirstOrDefault(x => item.FormulaID != 0 && x.FormulaID == item.FormulaID); if (dbTransitionAction_Formula == null) { dbTransitionAction_Formula = new TransitionAction_Formula(); dbTransitionAction.TransitionAction_Formula.Add(dbTransitionAction_Formula); } dbTransitionAction_Formula.TrueFalse = item.TrueFalse; dbTransitionAction_Formula.FormulaID = item.FormulaID; dbTransitionAction_Formula.Message = item.Message; } List <TransitionAction_EntityGroup> removeTransitionAction_EntityGroup = new List <TransitionAction_EntityGroup>(); foreach (var dbTransitionAction_EntityGroup in dbTransitionAction.TransitionAction_EntityGroup) { if (!msgTransitionAction.EntityGroups.Any(x => x.ID == dbTransitionAction_EntityGroup.EntityGroupID)) { removeTransitionAction_EntityGroup.Add(dbTransitionAction_EntityGroup); } } foreach (var citem in removeTransitionAction_EntityGroup) { projectContext.TransitionAction_EntityGroup.Remove(citem); } foreach (var item in msgTransitionAction.EntityGroups) { TransitionAction_EntityGroup dbTransitionAction_EntityGroup = dbTransitionAction.TransitionAction_EntityGroup.FirstOrDefault(x => item.ID != 0 && x.EntityGroupID == item.ID); if (dbTransitionAction_EntityGroup == null) { dbTransitionAction_EntityGroup = new TransitionAction_EntityGroup(); dbTransitionAction.TransitionAction_EntityGroup.Add(dbTransitionAction_EntityGroup); } dbTransitionAction_EntityGroup.EntityGroupID = item.ID; } } } projectContext.SaveChanges(); return(true); } } catch (Exception ex) { return(false); } }