示例#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);
        }
示例#2
0
        public bool UpdateWorkflow(WorkflowDC workflow)
        {
            Enforce.ArgumentNotNull(workflow, "workflow");
            Enforce.ArgumentNotNull(workflow.Id, "workflow.Id");
            Enforce.ArgumentNotNull(workflow.StartState, "workflow.StartState");
            Enforce.ArgumentNotNull(workflow.DisplayName, "workflow.DisplayName");
            Enforce.ArgumentGreaterThanZero(workflow.States.Count, "workflow.States");

            var validator            = new WorkflowValidation();
            ValidationResult results = validator.Validate(workflow);

            IRepositoryHelper repoHelper = new RepositoryHelper(_connectionString);

            try
            {
                var unitOfWork      = new JsonUnitOfWork(_connectionString);
                var wfRepo          = new WorkflowRepository(unitOfWork);
                var workflowUpdated = wfRepo.Update(workflow.GetWorkflow());

                var stateRepo = new StateRepository(unitOfWork);
                stateRepo.SetWorkflowStates(workflow.Id, workflow.States.ToRepoList());

                var actRepo = new StateActivityRepository(unitOfWork);
                actRepo.SetWorkflowStates(workflow.Id, workflow.Activities.ToRepoList());

                var tranRepo = new StateTransitionRepository(unitOfWork);
                tranRepo.SetWorkflowStates(workflow.Id, workflow.Transitions.ToRepoList());

                repoHelper.GetUnitOfWork().SaveChanges();
            }
            catch (Exception ex)
            {
                var message = ex.Message;
                throw;
            }
            return(true);
        }
示例#3
0
        public WorkflowDC GetWorkflow(string workflowId)
        {
            Enforce.ArgumentGreaterThanZero(workflowId, "workflowId");

            IRepositoryHelper repoHelper = new RepositoryHelper(_connectionString);

            WorkflowDC workflowDC = null;

            try
            {
                var wfRepo   = repoHelper.GetWorkflowRepository(repoHelper.GetUnitOfWork());
                var workflow = wfRepo.Get(workflowId);

                if (workflow != null)
                {
                    workflowDC = new WorkflowDC(workflow);

                    var stateRepo = new StateRepository(repoHelper.GetUnitOfWork());
                    workflowDC.States = stateRepo.GetByWorkflow(workflowId).ToDataContractList();

                    var actRepo = new StateActivityRepository(repoHelper.GetUnitOfWork());
                    workflowDC.Activities = actRepo.GetByWorkflow(workflowId).ToDataContractList();

                    var tranRepo = new StateTransitionRepository(repoHelper.GetUnitOfWork());
                    workflowDC.Transitions = tranRepo.GetByWorkflow(workflowId).ToDataContractList();

                    repoHelper.GetUnitOfWork().SaveChanges();
                }
            }
            catch (Exception ex)
            {
                var message = ex.Message;
                throw;
            }
            return(workflowDC);
        }