.net core elsa工作流程框架源码学习之Pipeline管道的理解

news/2024/10/4 11:35:24/文章来源:https://www.cnblogs.com/HelloQLQ/p/18442461
elsa这个框架运用管道来实现切面编程,切面编程的意义我的理解是在于:把业务逻辑和其他与业务不相关的逻辑进行解耦,或者把通用的逻辑:异常处理,日志处理等在不侵入业务逻辑的情况下,服务与这些业务。接下来,详细看看elsa框架的管道是怎么实现的。
主要依靠,下面这个委托方法,这个方法返回一个ValueTask对象,传入一个流程执行上下文参数。
0
 
0
注意:elsa一共有两种管道一个是workFlow的,一个是activity的,参数不一样,返回值一样,但他们各自管道内部的原理是一样的,这里以Activity管道举例。
依靠这个委托类型,elsa所有的不同的切面都会有一个能赋值给这个委托的执行切面入口方法,以便在管道里顺序执行切面。这个切面具体的样子,我举个例子:如异常的切面,代码如图:
0
它是怎么注册在管道里的呢?看代码:
 
0
0
它是在管道构建器上用了一个扩展方法,UseMiddleware方法,返回一个Func<activitymiddlewaredelgate,activitymiddlewaredelgate>的委托参数,上面提到了IActivityExecutionPipelineBuilder,这个Func就会注册到这个Builder里面。下面看看这个Builder的逻辑:
 
0
这个管道构建器有一个_compnents对象,它是用来存放注册的切面的,刚才的切面注册就是Use方法,截图的Build方法就是构建一个切面的调用链:
 
0
以上只是管道的注册和构建管道,那么管道在哪运行的呢?
0
这里注册管道,看看这里的参数ActivityExecutionPiepeline:
 
0
它其实就是这个action,这里的pipelie就是Builder,Use这些方法就是在注册切面,而 new ActivityExecutionPipeline(sp ,...Pipeline)对象的内部:
 
0
就是Builder.Build,就构建了一个调用链,而这些切面的执行,是靠ExecuteAsync方法实现的。
最终在
0
这里调用的pipeline
0
需要注意的是,这里的入口是Workflow的管道,它其实在这个执行过程中,在workflow管道执行结束时,会把workflow上下文转换成activity的上下文,然后在执行activity的管道。
代码如下:
 
0
而这个类是在workflow的切面:DefaultActivityScheduler里注册的,至此就能实现从workflow管道到activity管道的转换了。
 
0
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/806383.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

省前

111由于 Aqr 一直不更新博客,所以只能自己发了

[初中]我学不好语文,还能学好道法吗?

可以 首先放出我在同时期(八下期末)的语文和道法答题卡:看出来了吧,我的字不行 我觉得,道法像是“简单版”的语文 它也有答题模板,但使用的方法差异极大: 在道法中有一种口号类的题目,模板是做法+意义,这时只需根据材料内容,结合所学知识,默写出相关“为什么类”知识…

黄金

黄金这波涨势 要看3-5是否走完

『模拟赛』CSP-S模拟7(更新 T4

『模拟赛记录』CSP-S模拟5Rank 烂A. median 签。 你说得对,但是赛时嗯打 150 行 5k 代码超级分讨过了。 因为容斥做的不好,求总的然后减总会差点东西,所以直接分着加。发现如果中位数在这五个数中不止出现一次那么就会算重,所以分三种大情况考虑。 一,中位数只有一个。那么…

微积分快速入门5部分:基本算术、规律及花式算术

12 微积分的基本算术 12.1 加法12.2 乘法12.3 简单除法(倒数)你们原来的份额是 1/x(当 x=2 时,你有 1/2)。 有人进来 你的新份额变成1/(x+1)你的蛋糕数量是如何变化的?在求出总变化(及其恼人的代数)后,我们除以 dx,就得到了 “每 dx ”的变化:现在,我们去掉剩余的 d…

pbootcms常用的13个IF判断语句大全汇总

PBootCMS 提供了丰富的模板标签和条件判断功能,帮助开发者实现各种动态效果。以下是常用的 13 个 IF 判断语句及其具体应用示例。 1. 导航高亮 用途: 用于非首页的导航高亮。 语法:html{pboot:if([nav:scode]=={sort:tcode})}class="active"{/pboot:if}完整示例:…

残基和原子

从您提供的 aa_feature 类的截图信息来看,以下是对 aa_feature 类中各个属性的整理: 主要属性说明aa_embedding:residue_embedding: 一个嵌入层,形状为 (25, 64),用于表示氨基酸残基的嵌入。 res_pos_embedding: 一个嵌入层,形状为 (192, 64),用于表示氨基酸残基的位置嵌…

Windows下安装Nessus 10.8.3安装破解教程

1、下载: 下载地址:https://www.tenable.com/downloads/nessus 浏览器访问 https://127.0.0.1:8834 重点:Register offline,选择“Managed Scanner”, 再选择 “Tenable security center”,最后一步设置账号密码,账号密码没要求。 ​​ 2、获取插件包 2.1在命令行模式下(…

Web入门 ——生成验证码

<!DOCTYPE html> <html lang="zh-CN"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>验证码</title><script>let cu…

[OI] 猫树

喵~>_<概述 猫树是一种与线段树类似的数据结构 线段树在解决不带修区间问题时,对于单次查询是 \(O(\log)\) 的,此时运用猫树就可以将单次查询的复杂度降到 \(O(1)\) 合理运用分块的思想,在区间内分块,思考我们在块上查询的过程设黑色的线段为整个区间,红色的线段为查…