前言:引擎组件的基本职责是负责流程流转,但是在流转过程中,除了对内部控制逻辑进行实现外,也不可避免的要去调用或者响应外部事件。本文主要描述外部事件的类型,以及调用方法过程。

1. 外部事件的类型

外部事件的类型是随着引擎功能的需要而不断增加,开发人员也可以在此基础上进行扩展,目前主要常用的事件类型如下:

public enum ActionMethodType
{
  LocalMethod, //本地程序
  WebAPI, //调用WebAPI程序
  SQL, //执行SQL脚本
  StoreProcedure, //调用存储过程
  Python, //执行Python脚本
}

2. 外部事件的调用方法

2.1 本地程序

1) 节点属性定义

 2) 本地程序方法实现 

要调用的外部服务类,需要首先继承ExternalServiceBase类,同时实现IExternalService接口。下面的OrderSubmitService类就是一个具体实现类。请参考Slickflow.Module.External项目。

/// <summary>
/// 订单提交服务类(对应订单流程中订单提交节点)
/// </summary>
public class OrderSubmitService : ExternalServiceBase, IExternalService
{
/// <summary>
/// 业务逻辑前置调用方法
/// </summary>
public override void Execute()
{
//实现用户自己的业务逻辑
var id = DelegateService.GetID();
var amount = DelegateService.GetVariable("amount");
DoSomethingElse(amount, );
} /// <summary>
/// 业务逻辑具体实现方法
/// </summary>
/// <param name="amount"></param>
/// <param name="newAmount"></param>
private void DoSomethingElse(string amount, int newAmount)
{
var intAmount = ;
int.TryParse(amount, out intAmount); if (intAmount < newAmount)
{
DelegateService.SetVariable("amount", newAmount.ToString());
} //调用其它业务处理逻辑
var session = DelegateService.GetSession();
//实现其它数据库业务逻辑
//.............................
}
}

在引擎流转执行过程中,当解析到节点上有调用外部事件的Action定义时,将会使用反射方法,查找到组件是否有OrderSubmitService类,并且是实现了ExtneralServiceBase和IExternalService 接口的服务类,才能被执行其中的Execute()方法,必须满足上述的查找基类继承和接口实现条件才能被反射执行,否则是不能被执行的。这样可以确保是执行到了明确定义的事件程序代码。

2.2 WebAPI

 步骤1:节点属性上的事件定义

 步骤2:流程变量定义

通过WorkflowService接口写入流程变量(WfProcessVariable),变量用来传递WebApi方法的参数,此处作为示例:

 步骤3:被调用WebApi程序的接口方法实现示例

上述示例中有两个参数:runner和role, 在WebApi的方法代码中,可以使用JSON格式数据作为接收,然后根据做序列化处理。

2.3 SQL

在节点绑定事件中,可以执行SQL语句,SQL语句的文本和参数可以通过节点属性来定义,如下图所示:

流程变量的参数列表:

 2.4 StoreProcedure

存储过程是数据库定义的包含SQL脚本语法的程序过程(比如把上述的SQL脚本单独保存为存储过程),默认限定在同一个数据库实例中,支持入口参数,定义时,指定参数名称还有存储过程的名称就可以。

2.5 Python

Python脚本调用通SQL脚本调用,需要复制Python脚本,然后申明参数列表。需要主要的是目前仅支持IronPython版本。

3. 总结:

在跟外部事件交互调用过程中,调用逻辑统一封装在ActionExecutor.cs文件中,代码实现并没有特别复杂,主要是统一做了参数的存储和调用的处理,其中参数存在WfProcessVariable表中,然后在事件调用过程中,使用DelegateService方法来读取参数列表,从而完成最终方法的调用。

客户方如果对一些代码的实现有特殊的要求,客户方开发人员可以在此基础上完成二次开发或者定制,其基本要求是明白以下三个要素:节点属性定义读取、流程变量的存储和读取以及动态方法的调用。

最新文章

  1. ASP.NET MVC 随想录——探索ASP.NET Identity 身份验证和基于角色的授权,中级篇
  2. androidSDK无法更新的解决方法之一
  3. 微信连Wi-Fi专业设备列表
  4. 【JavaScript】JS的启动机制
  5. 求单链表倒数第m个结点
  6. [每日一题] OCP1z0-047 :2013-08-17 EXTERNAL TABLE――加载数据 ............................56
  7. 支持缩放的fresco图片控件 —— fresco sample: ZoomableDraweeView
  8. ASP.NET Core学习之一 入门简介
  9. 爬虫(requests)
  10. SOAP Binding: Difference between Document and RPC Style Web Services
  11. wrapper induction随笔
  12. Spring MVC 静态资源处理 (三)
  13. [TJOI2018]智力竞赛【网络流】
  14. jQuery筛选--first()和last()
  15. echart 圆滑初始化化
  16. 手把手让你实现开源企业级web高并发解决方案(lvs+heartbeat+varnish+nginx+eAccelerator+memcached)
  17. “Hello World!“”团队第七周召开的第二次会议
  18. .net core 使用redis 基于 StackExchange.Redis
  19. create a nodejs npm package
  20. ssh 远程执行命令简介

热门文章

  1. K8S命令-Kubectl 命令大全
  2. vue中子组件直接修改父组件prop属性bug
  3. C#8.0中新特性之一:结构readonly成员
  4. BOM对象——Location
  5. Spring Cloud Config实现集群配置中心
  6. 最近学习了Http连接池
  7. 亚马逊写作文档tip
  8. 在Ubuntu 18.04系统上安装Pydio Cells详细图文教程
  9. Jmeter中使用HTTP信息头管理器发送json格式请求体的接口
  10. Create a Report at Runtime 在运行时创建报表