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); }
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); }
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); }