前面我们分别讨论了使用Fluent API定义流程和使用JSON格式定义流程,按照以前的使用经验,感觉这两种定义方式应该可以互相转换,互相代替,但在实际应用中发现并不是如此,两种方式都有不能被替代的功能。
使用Fluent API可以使用Lambda 表达式定义步骤
我们可以在流程中直接使用Lambda表达式定义步骤,而不需要定义类,比如:
public class HelloWorldWorkflow : IWorkflow
{
public string Id => "HelloWorld";
public int Version => 1;
public void Build(IWorkflowBuilder<object> builder)
{
builder
.StartWith(context =>
{
Console.WriteLine("你好");
return ExecutionResult.Next();
})
.Then(context =>
{
Console.WriteLine("再见");
return ExecutionResult.Next();
});
}
}
这种方式无法使用JSON等格式实现。
采用JSON等DSL格式可以方便地定义步骤间的跳转
采用JSON等DSL格式时,每个步骤有明示的ID,步骤转移通过ID标识进行,这样可以很方便地进行步骤间的跳转。而采用Fluent API则没有这么灵活,我们看以下的定义:
{
"Id": "HelloWorld",
"Version": 1,
"Steps": [
{
"Id": "Hello",
"StepType": "ZL.WorflowCoreDemo.Basic.Steps.HelloWorld,ZL.WorflowCoreDemo",
"NextStepId": "Bye"
},
{
"Id": "Bye",
"StepType": "ZL.WorflowCoreDemo.Basic.Steps.GoodbyeWorld,ZL.WorflowCoreDemo"
"NextStepId": "Hello"
}
]
}
步骤“Hello”执行完成后,执行"Bye",“Bye”执行完又回到“Hello”,如此循环。但在Fluent API中就没有这么方便,必须使用循环或者其它的方式。而这种跳转方式在实际应用中非常常见,最常见的场景就是审批流程中的提交/驳回,提交-驳回过程可以形成多次循环,这种流程模式,采用带有步骤标记的跳转很容易实现。