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是一个最主要的工作流主机类。可以同时管理多个工作流实例,同时控制实例的激活等操作。】