我們已經知道了如何使用Fluent API定義流程和如何注冊流程,現(xiàn)在我們需要了解如何定義流程需要處理的數(shù)據(jù),和如何進行數(shù)據(jù)傳遞。這里舉一個最簡單的例子來說明。在前面的例子中,我們輸出“你好”和“再見”,現(xiàn)在擴展這個需求,流程啟動后,等待用戶輸入名字,然后輸出“你好,<輸入的名字>”和“<輸入的名字>,再見”。為了完成這個需求,需要:
- 定義一個數(shù)據(jù)結構用來保存輸入的名字
- 將這個數(shù)據(jù)結構與流程關聯(lián)起來
- 修改流程,讓流程等待用戶輸入
- 將用戶輸入的變量傳遞給流程
首先我們定義一個簡單的類,用來保存輸入的名字:
namespace ZL.WorflowCoreDemo.InputDataToStep
{
public class MyNameClass
{
public string MyName { get; set; }
}
}
然后,修改流程的定義:
using System;
using WorkflowCore.Interface;
using WorkflowCore.Models;
using ZL.WorflowCoreDemo.InputDataToStep.Steps;
namespace ZL.WorflowCoreDemo.InputDataToStep
{
public class HelloWithNameWorkflow : IWorkflow<MyNameClass>
{
public string Id => "HelloWithNameWorkflow";
public int Version => 1;
public void Build(IWorkflowBuilder<MyNameClass> builder)
{
builder
.StartWith(context => ExecutionResult.Next())
.WaitFor("MyEvent", (data, context) => context.Workflow.Id, data => DateTime.Now)
.Output(data => data.MyName, step => step.EventData)
.Then<HelloWithName>()
.Input(step => step.Name, data => data.MyName)
.Then<GoodbyeWithName>()
.Input(step => step.Name, data => data.MyName);
}
}
}
這里,流程聲明為 IWorkflow<MyNameClass>,說明流程使用這個類存儲數(shù)據(jù),在流程定義中,可以使用data操作相關的數(shù)據(jù)對象,比如: .Input(step => step.Name, data => data.MyName) 就是將流程數(shù)據(jù)中的MyName傳遞給步驟中的Name(step.Name)。
這段代碼中還使用WaitFor定義了一個事件,這個事件的輸出是將事件接收的外部參數(shù)(step.EventData)傳遞給流程的MyName屬性。
還需要修改兩個步驟,增加名稱字段:
using System;
using System.Collections.Generic;
using WorkflowCore.Interface;
using WorkflowCore.Models;
namespace ZL.WorflowCoreDemo.InputDataToStep.Steps
{
public class HelloWithName : StepBody
{
public string Name { get; set; }
public override ExecutionResult Run(IStepExecutionContext context)
{
Console.WriteLine("你好," + Name);
return ExecutionResult.Next();
}
}
}
using System;
using WorkflowCore.Interface;
using WorkflowCore.Models;
namespace ZL.WorflowCoreDemo.InputDataToStep.Steps
{
public class GoodbyeWithName : StepBody
{
public string Name { get; set; }
public override ExecutionResult Run(IStepExecutionContext context)
{
Console.WriteLine(Name + ",再見");
return ExecutionResult.Next();
}
}
}
下面是流程注冊和運行的代碼:
using System;
using WorkflowCore.Interface;
using WorkflowCore.Models;
using ZL.WorflowCoreDemo.InputDataToStep.Steps;
namespace ZL.WorflowCoreDemo.InputDataToStep
{
public class HelloWithNameWorkflow : IWorkflow<MyNameClass>
{
public string Id => "HelloWithNameWorkflow";
public int Version => 1;
public void Build(IWorkflowBuilder<MyNameClass> builder)
{
builder
.StartWith(context => ExecutionResult.Next())
.WaitFor("MyEvent", (data, context) => context.Workflow.Id, data => DateTime.Now)
.Output(data => data.MyName, step => step.EventData)
.Then<HelloWithName>()
.Input(step => step.Name, data => data.MyName)
.Then<GoodbyeWithName>()
.Input(step => step.Name, data => data.MyName);
}
}
}
using System;
using System.Collections.Generic;
using System.Threading;
using Microsoft.Extensions.DependencyInjection;
using WorkflowCore.Interface;
namespace ZL.WorflowCoreDemo.InputDataToStep
{
public class FlowRun
{
public static void Run()
{
IServiceProvider serviceProvider = ConfigureServices();
var host = serviceProvider.GetService<IWorkflowHost>();
host.RegisterWorkflow<HelloWithNameWorkflow, MyNameClass>();
host.Start();
var initialData = new MyNameClass();
var workflowId = host.StartWorkflow("HelloWithNameWorkflow", 1, initialData).Result;
Console.WriteLine("輸入名字");
string value = Console.ReadLine();
host.PublishEvent("MyEvent", workflowId, value);
Console.ReadLine();
host.Stop();
}
private static IServiceProvider ConfigureServices()
{
//setup dependency injection
IServiceCollection services = new ServiceCollection();
services.AddLogging();
services.AddWorkflow();
var serviceProvider = services.BuildServiceProvider();
return serviceProvider;
}
}
}
運行效果如下:

圖片.png
我們也可以使用字典作為數(shù)據(jù)對象,流程的定義如下:
using System;
using System.Collections.Generic;
using WorkflowCore.Interface;
using WorkflowCore.Models;
using ZL.WorflowCoreDemo.InputDataToStep.Steps;
namespace ZL.WorflowCoreDemo.InputDataToStep
{
public class HelloWithNameWorkflowDynamic : IWorkflow<Dictionary<string,string>>
{
public string Id => "HelloWithNameWorkflowDynamic";
public int Version => 1;
public void Build(IWorkflowBuilder<Dictionary<string, string>> builder)
{
builder
.StartWith(context => ExecutionResult.Next())
.WaitFor("MyEvent", (data, context) => context.Workflow.Id, data => DateTime.Now)
.Output((step,data)=>data.Add("Name",(string)step.EventData))
.Then<HelloWithName>()
.Input(step => step.Name, data => data["Name"])
.Then<GoodbyeWithName>()
.Input(step => step.Name, data => data["Name"]);
}
}
}
這里沒有使用自定義的類,而是使用了字典Dictionary<string, string>,流程的運行代碼如下:
IServiceProvider serviceProvider = ConfigureServices();
var host = serviceProvider.GetService<IWorkflowHost>();
host.RegisterWorkflow<HelloWithNameWorkflowDynamic, Dictionary<string,string>>();
host.Start();
var initialData = new Dictionary<string,string>();
var workflowId = host.StartWorkflow("HelloWithNameWorkflowDynamic", 1, initialData).Result;
Console.WriteLine("輸入名字");
string value = Console.ReadLine();
host.PublishEvent("MyEvent", workflowId, value);
Console.ReadLine();
foreach (var key in initialData.Keys)
{
Console.WriteLine(key + ":" + initialData[key]);
}
Console.ReadLine();
host.Stop();
可以從github下載完整的代碼:https://github.com/zhenl/ZL.WorflowCoreDemo