Elsa 创建并启动一个工作流
以前写了一半,Elsa 3.0重新进行了设计,又不想写了,唉, 2023-04-5
已过时,最新版请参考 Elsa 3.0 ,3.0中相关重新进行了设计
前言:
学习而已,初见Elsa时,感觉很奇妙,到底是什么样的思想才能够设计出这么巧妙的程序...
长风破浪会有时,直挂云帆济沧海。
学习过程记录下来,以后忘了回头看看。
工作流创建
代码来自Elsa源代码库。
如下图定义一个简单的工作流
使用 IBuildsAndStartsWorkflow 创建工作流
进入源代码查看创建过程,如下图使用 WorkflowBuilderFactory 工作流构建工厂创建一个工作流
这里有个很奇怪的地方 “_workflowBuilderFactory()” ,居然还可以注册一个 “Func<IWorkflowBuilder>” 返回IWorkflowBuilder类型的委托,我还是头一次见这么玩的,在下佩服。
通过源代码看来,注册成“Func<IWorkflowBuilder>”其实就是每次都是获取一个新的 “IWorkflowBuilder” 对象,源代码如下图
调用 Build<T>() 方法,创建工作流蓝图,进入源代码,会进入到下图所示代码中
该代码主要就是从 IOC 容器中创建出一个指定类型的对象,如下图,反编译查看源代码
执行 “ Build(workflow, activityIdPrefix) ” 创建工作流,Build中的具体源代码
- 该类为 WorkflowBuilder ,继承 IWorkflowBuilder、CompositeActivityBuilder ,关于 IWorkflowBuilder 相关信息查看这里
- 默认获取该工作流名称
- 设置Name属性
- 设置DisplayName属性
- 进入WithId的方法源代码如图 ,因为WorkflowBuilder 也继承 IActivityBuilder ,也就是说,该工作流整体也可以表示为一个Activity ,那么此处就是设置ActivityId
-
workflow.Build(this) 就是调用自定义工作流中的public void Build(IWorkflowBuilder builder) 方法,如下图
7. 创建蓝图
具体介绍下 workflow.Build(this) 也就是 Build(IWorkflowBuilder builder)
IWorkflowBuilder
关于 IWorkflowBuilder 相关信息查看这里 ,对IWorkflowBuilder要有一个大致的印象。
IWorkflowBuilder 继承 IBuilder,IBuilder 源代码如下图
翻译过来就是说,可以添加任意一个Activity到IBuilder中。也就是说 IWorkflowBuilder 可以添加 任意 Activity 到 IWorkflowBuilder 对象中。
接下来看一个 Activity ,WriteLine 是一个 Activity 如下图
进入到源代码中,如下图,中间不相关代码省略了
CallerLineNumber 、 CallerFilePath 这几个参数忽略,这几个参数就是用来调试用的,相关信息,上网搜索。
builder.WriteLine(".....") , 会进入到上图中 1 中
本文作者:youliCC