Exemple #1
0
        public static StateMachine <State, string> ConfigureStateMachine(Workflow workflow, InstanceStatePersistence statePersistance, IRepositoryHelper repoHelper)
        {
            Enforce.ArgumentNotNull(workflow, nameof(workflow));
            Enforce.ArgumentNotNull(statePersistance, nameof(statePersistance));
            Enforce.ArgumentNotNull(repoHelper, nameof(repoHelper));

            var stateMachine = new StateMachine <State, string>(statePersistance.GetCurrentState, statePersistance.SetCurrentState);

            //  Get a distinct list of states with a trigger from state configuration
            //  "State => Trigger => TargetState
            var stateRepo      = repoHelper.GetStateRepository(repoHelper.GetUnitOfWork());
            var transitionRepo = new StateTransitionRepository(repoHelper.GetUnitOfWork());

            var states = transitionRepo.Where(t => t.WorkflowId == workflow.Id).Select(t => stateRepo.Get(t.StateId)).Distinct().ToList();

            //var transitions = transitionRepo.Where(s => s.WorkflowId == workflow.Id).ToList();

            //  Assigning triggers to states
            foreach (var state in states)
            {
                var transitions = transitionRepo.Where(t => t.StateId == state.Id).Select(t => new { Trigger = t.Trigger, TargetState = stateRepo.Get(t.TargetStateId) }).ToList();

                foreach (var tran in transitions)
                {
                    if (tran.TargetState != null)
                    {
                        stateMachine.Configure(state).Permit(tran.Trigger, tran.TargetState);
                    }
                }
            }

            return(stateMachine);
        }