Beispiel #1
0
        /// <summary>
        /// Builds workflow and validates from workflow template
        /// </summary>
        /// <param name="workflowDefinition"></param>
        /// <param name="sagaStepBehaviorFactory"></param>
        public Workflow(WorkflowDefinition workflowDefinition, ISagaStepBehaviorFactory sagaStepBehaviorFactory, IJsonSchemaDefinitionFactory jsonSchemaDefinitionFactory)
        {
            WorkflowDefinition = workflowDefinition;
            Name    = workflowDefinition.Name;
            Version = workflowDefinition.Version;
            _sagaStepBehaviorFactory = sagaStepBehaviorFactory;

            //Add all edges starting from "START" with their nodes
            foreach (WorkflowDefinition.Edge edge in workflowDefinition.Edges.Where(e => e.FromNodeKey.Equals(DoubleLinkedDirectedGraph <NodeData, EdgeData> .START_NODE_KEY)))
            {
                WorkflowDefinition.Node toNode = workflowDefinition.Nodes.Where(n => n.NodeKey.Equals(edge.ToNodeKey)).FirstOrDefault();
                CheckIfSagaStepBehaviorExists(toNode);
                JsonSchema dataJsonSchema = jsonSchemaDefinitionFactory.GetJsonSchemaDefinition(toNode.DataJsonSchemaModuleKey, toNode.DataJsonSchemaKey, toNode.DataJsonSchemaVersion).JsonSchema;
                _internalWorkflow.InsertFromStart(toNode.NodeKey, new NodeData(toNode.Description, dataJsonSchema, toNode.BehaviorModuleKey, toNode.BehaviorKey, toNode.BehaviorVersion, toNode.BehaviorConfiguration));
            }

            //Add all remaining edges with their nodes
            List <WorkflowDefinition.Edge> nonInsertedEdges = workflowDefinition.Edges.Where(e => !e.FromNodeKey.Equals(DoubleLinkedDirectedGraph <NodeData, EdgeData> .START_NODE_KEY)).ToList();

            while (nonInsertedEdges.Count > 0)
            {
                //Select first that have an included nodekey to avoid problems
                WorkflowDefinition.Edge edge   = nonInsertedEdges.Where(f => _internalWorkflow.AlreadyAddedNodeKeys.Contains(f.FromNodeKey)).First();
                WorkflowDefinition.Node toNode = workflowDefinition.Nodes.Where(n => n.NodeKey.Equals(edge.ToNodeKey)).FirstOrDefault();
                CheckIfSagaStepBehaviorExists(toNode);
                JsonSchema dataJsonSchema = jsonSchemaDefinitionFactory.GetJsonSchemaDefinition(toNode.DataJsonSchemaModuleKey, toNode.DataJsonSchemaKey, toNode.DataJsonSchemaVersion).JsonSchema;
                _internalWorkflow.Insert(edge.FromNodeKey, toNode.NodeKey, edge.Description, new NodeData(toNode.Description, dataJsonSchema, toNode.BehaviorModuleKey, toNode.BehaviorKey, toNode.BehaviorVersion, toNode.BehaviorConfiguration));

                nonInsertedEdges.Remove(edge);
            }

            _internalWorkflow.FinishGraph();
        }
Beispiel #2
0
        public WorkflowActor(WorkflowDefinition workflowDefinition, ISagaStepBehaviorFactory sagaStepBehaviorFactory, IJsonSchemaDefinitionFactory jsonSchemaDefinitionFactory)
        {
            //TODO check that sagaStepBehaviorFactory contains behaviors defined in workflowdefinition
            Workflow = new Model.Workflow(workflowDefinition, sagaStepBehaviorFactory, jsonSchemaDefinitionFactory);
            _sagaStepBehaviorFactory = sagaStepBehaviorFactory;

            Command <ISagaCRUDMessage>(message =>
            {
                Context.IncrementMessagesReceived();
                PersistWorkflowData(message);
                SagaCRUDMessageHandler(message);
            });

            Command <LookupSagaMessage>(message =>
            {
                Context.IncrementMessagesReceived();
                LookupSagaMessageHandler(message);
            });

            Command <ListAllSagasMessage>(message =>
            {
                Context.IncrementMessagesReceived();
                ListAllSagasMessageHandler(message);
            });

            #region Ignored Messages

            #endregion
        }