首页 > 代码库 > workflow 4.0

workflow 4.0

Workflow 4.0

1、  新建项目,选择.net framework4.5,然后选中C#分支里的workflow,最后选择活动库创建一个workflow项目。

2、  在xaml设计界面拖入一个Sequence控件,Sequence代表一个顺序流,会按照顺序执行。

3、 技术分享

 

属性中的displayname可以设置备注名,以使得工作流更清晰的展现流程过程。

4、  为了更灵活的配置工作流和之后的修改,可以把工作流分支化,把一些具体的实现流程写到代码活动中,只在工作流中引用,避免主工作流复杂化。具体操作:项目中右键,选择添加新建项,选中左侧的workflow,然后选择代码活动创建,这里我们假设创建一个审批的代码活动approve.cs。

5、  这里我们定义两个输入参数和一个输出参数

public InArgument<Mapprove> in_appro { get; set; }

public InArgument<rule> in_rule { get; set; }

public OutArgument<Mapprove> out_param { get; set; }

然后在Execute方法中获取输入参数,获取方法为:

第一种方法:Mapprove  in_appro = context.GetValue(this.in_appro);

第二种方法:in_param.Get(context);

然后对输入参数做判断和处理,如果有输出参数,就给输出参数赋值,赋值方法为:

context.SetValue(out_param, in_appro);

 技术分享

 

6、  然后回到xaml设计界面,在最外层Sequence定义一个同类型变量接收输出变量,就能使用工作流中定义的那个变量得到这个输出变量。再定义两个同名的参数,注意大小写敏感,一定要名称和类型都一样。自定义类型在浏览类型里选择,如下图:

 技术分享

 

7、  这样,创建好一个代码活动后,编译程序,再回到xaml设计界面的工具箱里就会多出你刚刚添加的代码活动工具,拖拽到工作流的合适位置,设置好输入输出参数以及给这些参数赋值。如下图所示:

 技术分享

 

8、  我们再到工具箱拖拽几个常用的的控件:if(判断)、Sequence(顺序流)、Assign(赋值)。这样就能组成一个基本的审批流程了。最终完成效果如下图所示:

 技术分享

 

9、  现在我们已经创建好了工作流,接下来我们就来调用它,在项目中添加工作流项目的引用并引入命名空间using System.Activities;

 技术分享

 

10、 Activity  approve1 = new  mainflow();一个工作流对象mainflow就是我们上面创建的工作流。

WorkflowInvoker.Invoke(approve1);执行工作流。这样就完成了一个最简单的工作流调用,但是我们上边有定义输入输出参数,所以我们还需要传入参数和得到工作流执行完成后的返回值。

工作流只接受IDictionary<string, object>的参数格式,我们先定义两个传入参数和一个接收返回值的变量。

IDictionary<string, object> result = new Dictionary<string, object>();//定义一个接收工作流的变量

Dictionary<String, Object> wfPara = new Dictionary<string, object>();//定义一个传入工作流的变量

wfPara.Add("appro", fee); //把需传入工作流中的appro参数加入到定义的IDictionary<string, object>变量中,大小写敏感。Appro为参数名,fee为传入的同类型变量。

wfPara.Add("rule", fee_rule);//同上

Activity  approve1 = new  mainflow();

result = WorkflowInvoker.Invoke(approve1, wfPara);// 运行工作流,同时传入参数和接收返回值。

最后通过result["appro"] 就能使用返回的变量了。注:appro为工作流中定义的输出参数

11、 这样,一个基本的有输入输出参数,以及自定义代码活动的工作流的demo就完成了。

12、 最后补充,workflow有三种执行方式:

①:使用WorkflowInvoker类中的InVoke静态方法WorkflowInvoker.Invoke(myWF);   //myWF为自定义的workflow实例

  【这种方式可以像一个函数一样顺序执行我们的工作流程,非常简单,但是在工作流执行过程中,不能与工作流实现数据的交换】

 

②:调用WorkflowApplication实例的Run方法-->WorkflowApplication wfApp = new WorkflowApplication(myWF); wfApp.Run();   //myWF为自定义的workflow实例

  【可以控制工作流实例长时间运行,可以在运行过程中和实例进行数据交换。但是只能执行一个的工作流实例。】

 

③:使用WorkflowServiceHost类host起来一个服务,然后在客户端声明一个ServiceClient类的实例,用这个实例通过WCF与之前host起来的服务进行通信完成workflow的触发调用。

  【WorkflowServiceHost是一个最主要的工作流主机类。可以同时管理多个工作流实例,同时控制实例的激活等操作。】

workflow 4.0