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中的具体源代码

  

 

 

  1. 该类为 WorkflowBuilder ,继承 IWorkflowBuilder、CompositeActivityBuilder ,关于 IWorkflowBuilder 相关信息查看这里
  2. 默认获取该工作流名称
  3. 设置Name属性
  4. 设置DisplayName属性
  5.  进入WithId的方法源代码如图 ,因为WorkflowBuilder 也继承 IActivityBuilder ,也就是说,该工作流整体也可以表示为一个Activity ,那么此处就是设置ActivityId
  6.  

     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 中

 

 

    

 

 

 

 

 

  

posted @ 2023-05-10 22:03  youliCC  阅读(561)  评论(0编辑  收藏  举报