什么是工作流?
工作流(Workflow),是对工作流程及其各操作步骤之间业务规则的抽象、概括、描述。
BPM:是Business Process Management的英文字母缩写.即业务流程管理,是一套达成企业各种业务环节整合的全面管理模式。
工作流软件,顾名思义,就是业务信息数据在多个环节模块之间的流转。
企业内部业务种类非常多、变化也非常多。虽然业务变化非常多,但是流程的控制基本是不变的。我们常说的工作流或者是“流程”就是指 控制流程流转的核心引擎。
市面常见的工作流开发框架如下所示。
Windows Workflow Foundation
Windows Workflow Foundation(以下简称WWF)提供了一个编程框架和工具以开发和执行各种不同的基于工作流的应用程序,比如文档管理、线型的商业应用、贸易单据流程、IT管理、B2B应用以及消费者应用。
WF(Windows Workflow Foundation)是微软的工作流基础组件。它是DotNet Framework中提供基于模型或者是声明方式的流程执行引擎。
WF由DotNet Framework3.0一起发布。而且已经被应用与微软的Sharepoint技术中。
WF包括3个核心组件:
- 活动框架
- 工作流活动运行时环境
- 工作流设计器
第一个工作流项目
1、打开VS新建一个解决方案,在解决方案中新建项目——WorkFlow——工作流控制台应用程序,命名为WorkflowConsoleApp
2、视图——工具箱,添加WriteLine基元
WriteLine Activity:用于输出一段字符串。
再添加一个WriteLine基元
会自动将这两个基元包装在一个Sequence序列容器里面,然后执行顺序从上至下。当然也我们可以先添加一个Sequence序列容器,然后再往这个容器里面添加基元。
顺序工作流
- 顺序工作流就是将顺序工作流容器中的所有动作按照顺序往下执行。
顺序容器Sequence:是在System.Activities.dll中定义的类型,继承 NativeActivity是一个 sealed类。
1.[Activities]集合,可以存放Activity
2.[Activities]集合中的Activity按顺序从上向下执行
3.[Variables]集合用于存放变量
3、我们来看Program.cs中的代码如下:
Activity workflow1 = new Workflow1(); WorkflowInvoker.Invoke(workflow1);
这里就是工作流的启动方式。WorkflowInvoker 包含同步调用工作流的实例方法和静态方法。
为了更好的查看运行效果,添加如下代码:
Console.ReadLine();
4、按F5运行
WF入门之活动
Activity在WF中是一个最基本的概念,当谈及Activity时,通常是指如下两个概念:
- Activty Class 。
- 在工作流中任意Activity派生类的统称。
活动也就是流程中的步骤如果下图
流程图工作流
流程图工作流:就是将工作节点按照流程图规定的顺序进行流动的工作流。
流程图工作流跟顺序工作流的区别:顺序工作流只能从上往下执行,而流程图工作流可以按照流程图规定的顺序进行流程的流转。
这里,我们新建一个财务审批流程。
1、 新建活动
右键单击项目WorkflowConsoleApp,添加“新建项”,选择活动,命名为MoneyApproveActivity.xaml
2、 添加流程
修改名称为”财务审批流程”。
3、 添加两个WriteLine基元
4、 添加代码活动
CodeActivity 代码活动
- WF4.0 提供了许多Activity,但有时这些Activtiy并不能完成具体功能,如向数据库添加数据,发送电子邮件等.在实现这些具体功能时,我们仍要使用某种编程语言,如C#.当我们需要这种功能时,可以使用 CodeActivity。
- 它是一个抽向类,继承该类后,需要override该类的Execute方法,用于编写自定义的功能代码
右键单击项目WorkflowConsoleApp,添加“新建项”,选择“代码活动”,然后命名为InputMoneyCodeActivity.cs
这个时候,我们看见默认的代码如下:
public sealed class InputMoneyCodeActivity : CodeActivity { // 定义一个字符串类型的活动输入参数 public InArgument<string> Text { get; set; } // 如果活动返回值,则从 CodeActivity<TResult> // 派生并从 Execute 方法返回该值。 protected override void Execute(CodeActivityContext context) { // 获取 Text 输入参数的运行时值 string text = context.GetValue(this.Text); } }
这里,我需要修改一下代码,因为我要的并不是输入参数,而是要输出一个金额给到当前这个流程,然后再根据这个金额的大小来判断流程的走向。
工作流中的数据的传递
- Variable变量:跟C#一样可以再整个工作流或者是其中的一个Activity中添加一个变量。可以通过可视化的控制:变量的类型、作用域、默认值等 。
- Assign 赋值。可以对流程内定义的参数,变量赋值。
- Arguments 参数:Activity中传入的参数或者是传出的参数。
In参数:System.Activities.InArgument<T>传入参数,可以在流程启动的时候传入参数的值。只能用于数据传入流程节点内部。
Out参数:System.Activities.OutArgument<T>。用于将流程节点内部的数据传递到外部的变量或者其他流程的传入参数。
In/Out参数:System.Activities.InOutArgument<T>。即用于传入也用于传出。
5、 修改代码如下:
public sealed class InputMoneyCodeActivity : CodeActivity { // 定义一个字符串类型的活动输入参数 //public InArgument<string> Text { get; set; } //定义一个Int类型的输出参数 public OutArgument<int> Money { get; set; } // 如果活动返回值,则从 CodeActivity<TResult> // 派生并从 Execute 方法返回该值。 protected override void Execute(CodeActivityContext context) { // 获取 Text 输入参数的运行时值 //string text = context.GetValue(this.Text); int money; var v = Console.ReadLine(); int.TryParse(v,out money); context.SetValue(Money, money); } }
6、 生成项目WorkflowConsoleApp
7、 回到MoneyApproveActivity.xaml页面
会发现工具箱中多了一个组件InputMoneyCodeActivity,将其拖放到MoneyApproveActivity.xaml界面中。
8、 重命名,双击InputMoneyCodeActivity组件,修改名称为“获取输入金额”。
9、添加变量,用于接收InputMoneyCodeActivity代码活动中的输出参数的值,这样在整个流程中才能够访问到这个接收的金额。
右键单击活动代码“获取输入金额”,选择“属性”,将Money的值赋值给全局变量GetMoney。
10、 添加WriteLine基元,流转到“经理审批”
11、添加条件分支
添加条件,让500作为一个判断条件,分为大于500为True和小于等于500为False。
12、添加两个WriteLine基元,当条件为True和False各执行一个基元。
13、 将MoneyApproveActivity活动设为启动项。
修改Program代码如下:
//Activity workflow1 = new Workflow1(); Activity workflow1 = new MoneyApproveActivity(); WorkflowInvoker.Invoke(workflow1); Console.ReadLine();
14、运行结果如下:
源码下载地址:WorkflowConsoleApp.zip