static ActivityDefinitionService() { var workflowDefinition = new WorkflowDefinition { Name = "流程1" }; var definition2 = new ActivityDefinition { Name = "Task2", Start = false, // State = null, WorkflowDefinition = workflowDefinition }; var definition = new ActivityDefinition { Name = "Task1", Start = true, // State = null, WorkflowDefinition = workflowDefinition }; workflowDefinition.Activitys = new[] { definition, definition2 }; workflowDefinition.Transitions = new List<TransitionDefinition> { new TransitionDefinition { SourceActivity = definition, DestinationActivity = definition2, WorkflowDefinition = workflowDefinition } }; WorkflowDefinitions.Add(workflowDefinition); }
private void StartWorkflow(WorkflowContext workflowContext, ActivityDefinition activityDefinition, IDictionary<string, object> environment) { var cancellationToken = new CancellationToken(); InvokeActivities(activity => activity.OnWorkflowStarting(workflowContext, cancellationToken)); if (cancellationToken.IsCancelled) return; InvokeActivities(activity => activity.OnWorkflowStarted(workflowContext)); var blockedOn = ExecuteWorkflow(workflowContext, activityDefinition, environment).ToList(); if (blockedOn.Any()) { foreach (var blocking in blockedOn) { workflowContext.WorkflowInstance.AwaitingActivities.Add(new AwaitingActivityDefinition { ActivityDefinition = blocking, WorkflowInstance = workflowContext.WorkflowInstance }); } } }
public IEnumerable<ActivityDefinition> ExecuteWorkflow(WorkflowContext workflowContext, ActivityDefinition activityDefinition, IDictionary<string, object> environment) { var scheduled = new Stack<ActivityDefinition>(); scheduled.Push(activityDefinition); while (scheduled.Any()) { activityDefinition = scheduled.Pop(); var activityContext = CreateActivityContext(activityDefinition, environment); var cancellationToken = new CancellationToken(); InvokeActivities(activity => activity.OnActivityExecuting(workflowContext, activityContext, cancellationToken)); if (cancellationToken.IsCancelled) continue; var outcomes = activityContext.Activity.Execute(workflowContext, activityContext).ToList(); InvokeActivities(activity => activity.OnActivityExecuted(workflowContext, activityContext)); foreach (var outcome in outcomes) { var transition = workflowContext.WorkflowInstance.WorkflowDefinition.Transitions.FirstOrDefault(x => x.SourceActivity == activityDefinition && x.DestinationActivity.Name == outcome); if (transition != null) { scheduled.Push(transition.DestinationActivity); } } } return new ActivityDefinition[0]; }
private ActivityContext CreateActivityContext(ActivityDefinition activityDefinition, IDictionary<string, object> environment) { return new ActivityContext { Activity = _activitiesManager.GetActivityByName(activityDefinition.Name), Environment = environment }; }