自从做了程序员,发现自己长胖了,而且自己的身体抵抗力也出了问题,最近身体不适,公司工作任务最近也很赶,上次写了WF4.0的简介,这次就工作中工作流设计的几种方式稍微总结一下。设计工作流包括四种方式:流程图工作流,程序工作流,状态机工作流,自定义命令性代码创建工作流.

流程图工作流

工作流设计中最常用的就是FlowChart,FlowChart用于实现非顺序的工作流,如果不适用FlowDecision节点,FlowChart也可以用于顺序工作流。首先来看下工具箱提供的流程图节点:

Flowchart 活动是包含从 FlowNode 继承的流节点集合的活动,流节点可以包含要执行以及将执行指向其他流节点的子活动。构建流程图的过程中,可以使用三种元素类型来进行流控制:

FlowStep:在流程图中构建一个执行步骤的模型;

FlowDecision:类似于if的语法,传入条件可以进行判断;

FlowSwitch:类似于Switch,可以根据传入条件判断;

关于FlowDecison建一个简单的流程,从流程图中拖一个FlowDecision,判断条件为:10==100

这个时候我们可以查看一下后台生成的代码如下(FlowSwitch类似就不举例):

程序工作流

程序工作流使用的流控制方法与程序语言中使用的流控制方法类似。这些构造包括 While,DoWhile,If....。使用 FlowChart和 Sequence等其他流控制活动,可以随意组合这些工作流。

这个就是需要根据具体的业务使用,就不一一举例~

状态机工作流

.NET Framework 4没有提供状态机活动或工作流模型,NET Framework 4.5中为WF4.0提供了状态机支持,这里有 个老外写的例子,大家可以自己研究一下:

http://blogs.msdn.com/b/morgan/archive/2010/06/15/a-practical-state-machine-example.aspx

自定义命令性工作流

首先看一个最简单WriteLine的输出:

   Activity activity = new WriteLine() { Text = "keso" };
WorkflowInvoker.Invoke(activity);

输出一个Sequence:

  Activity activity1 = new WriteLine() { Text = "keso" };
Activity activity2 = new WriteLine { Text = "FlyElephant" };
Activity sequence = new Sequence() { Activities = { activity1, activity2 } };
WorkflowInvoker.Invoke(sequence);

特别说明:WorkflowInvoker提供调用工作流的简单方法,就像方法调用一样,并且只可用于不使用持久性的工作流。WorkflowApplication 为执行工作流提供更丰富的模型,包括生命周期事件通知、执行控制、书签恢复和持久性。这里就简单的用WorkflowInvoker将就一下.

如果你对上面的代码不是很爽,你可以这样写:

            WriteLine line1= new WriteLine() ;
line1.Text = "keso";
WriteLine line2 = new WriteLine();
line2.Text = "FlyElephant";
Sequence sequence = new Sequence();
sequence.Activities.Add(line1);
sequence.Activities.Add(line2);
WorkflowInvoker.Invoke(sequence);

下面开始看一个简单的小例子,输出一个随机数到控制台:

           //定义变量number
Variable<int> number = new Variable<int>
{
Name = "Test"
};
Activity activity = new Sequence
{
Variables = { number },
Activities = {
//将随机数的数值赋值给number
new Assign<int>(){
To=number,
Value=new Random().Next(1,100)
},
new WriteLine(){
//取值
Text = new InArgument<string>((context) => "随机数:" + number.Get(context))
}
}
};
WorkflowInvoker.Invoke(activity);

 关于取值那一块需要说明一下的就是去取值需要传入的值是AcitivityContext,使用Lambda表达式进行访问,Lambda不可序列化成XAML格式,这个时候需要换种写法:

  Text = new InArgument<string>((context) => "随机数:" + number.Get(context))

  动态活动

上面通过活动的组合,设置活动的参数和属性可以是实现代码编写工作流定义,但是唯一的缺憾就是可以绑定现有参数却没法将新的参数添加到活动中,定义的参数在保存为内存对象树的时候是有对应的CLR类型,如果新的参数则没法解析,这个时候可以考虑使用DynamicActivity。

简单实现两个整数的乘法:

   //定义两个参数
InArgument<int> number1 = new InArgument<int>();
InArgument<int> number2 = new InArgument<int>();
DynamicActivity<int> wf = new DynamicActivity<int>
{
Properties = {
//新建属性
new DynamicActivityProperty{
Name="First",
Type=typeof(InArgument<int>),
Value=number1
},
new DynamicActivityProperty{
Name="Second",
Type=typeof(InArgument<int>),
Value=number2
}
},
Implementation = () => new Sequence()
{
Activities = {
new Assign<int>{
To=new ArgumentReference<int>{ArgumentName="Result"},
// 取值
Value=new InArgument<int>((context)=>number1.Get(context)*number2.Get(context))
}
}
}
};
Dictionary<string, object> wfParams = new Dictionary<string, object>{
{ "First", 36 },
{ "Second", 72 }
};
//先给属性赋值,然后获取乘积
int result = WorkflowInvoker.Invoke(wf, wfParams);
Console.WriteLine(result);

  第二篇先写到这里吧,有些东西还是需要有点基础的,一个个的写实在感觉太庞杂,如果周末有空补几篇稍微基础一点的使用,你的推荐就是我写作的最大动力,如果你觉得有所收获,顺手给个赞吧,多谢~

WF4.0(2)----设计工作流的更多相关文章

  1. 【转】WF4.0 (基础篇)

    转自:http://www.cnblogs.com/foundation/category/215023.html 作者:WXWinter  ——  兰竹菊梅★春夏秋冬☆ —— wxwinter@16 ...

  2. 基于WF4.0的公文管理系统

    系统功能说明 公文管理 通过定义公文的基本信息,并将它按照工作流的定义流转实现公文的管理.包含以下功能: )公文创建:用户能够将格式化文本作为公文上传到系统中,并选择工作流启动流程. )公文审批:具有 ...

  3. WF4.0 基础篇 (一)开始使用WF

    来源:https://www.cnblogs.com/caosenianhuan/p/WF.html 最近公司要重新上线一套新的CRM系统,要重整老系统里的业务流模块,团队讨论已微软的workflow ...

  4. WF4.0 基础篇 (十八) Flowchar

    本节主要介绍WF4 中 Flowchart的使用 本文例子下载: http://files.cnblogs.com/foundation/FlowcharSample.rar 本文例子说明 Flowc ...

  5. 【转】WF4.0实战系列索引

    转自:http://www.cnblogs.com/zhuqil/archive/2010/07/05/wf4-in-action-index.html 此系列的工作流文件案例比较多点,实用性好. W ...

  6. WF4.0(3)----变量与参数

    已经写了两篇关于WF4.0的博客,算是基础博客,如果是WF比较熟悉就直接跳过吧,如果你对工作流不是很熟悉,或者想了解一下基础的东西,本文还是比较适合你的.工作流中变量,参数,表达式属于数据模型中概念, ...

  7. WF4.0——升级技能:托付应用

    回想: 在一个月前,我们刚刚回想了面对象至关重要的部分:托付,详细请移步我们博客:面向对象--一起来复习托付与事件!关于这篇博客的详细内容,不再赘述,在这里我们主要讨论在工作流中的应用及他的详细怎样解 ...

  8. (转)OAuth 2.0的设计思路

    OAuth是一个关于授权(authorization)的开放网络标准,在全世界得到广泛应用,目前的版本是2.0版. 本文对OAuth 2.0的设计思路和运行流程,做一个简明通俗的解释,主要参考材料为R ...

  9. Magicodes.IE 3.0重磅设计畅谈

    总体设计 Magicodes.IE导入导出通用库,支持Dto导入导出.模板导出.花式导出以及动态导出,支持Excel.Csv.Word.Pdf和Html. IE在去年年底重构一次之后,经过这么长时间的 ...

随机推荐

  1. JFinal框架使用

    表单直接提交页面,不用ajax 后台; /** * 修改 */ public void edit() { String id=getPara("id"); String job=g ...

  2. 一文搞定 Mybatis 的应用

    Mybatis 介绍 Mybatis 是一个开源的持久层框架,原来叫 ibatis ,它对 jdbc 操作数据库的过程进行了封装,使开发者只需要关注 SQL 本身,而不需要花费精力去处理例如注册驱动. ...

  3. Python下读取转换unicode的json格式

    转自: https://blog.csdn.net/felcon/article/details/38524317 JSON(JavaScript Object Notation) 是一种轻量级的数据 ...

  4. [ 原创 ]学习笔记-Android中隐式Intent 的使用

    Android中Intent的使用分为显示Intent和隐式Intent 之前已经介绍过显示Intent的用法了,今天来介绍一下隐式Intent的用法. 当我们在使用一款软件时,如果需要从该软件内部开 ...

  5. springBoot application.properties 基础配置

    # 文件编码 banner.charset= UTF-8 # 文件位置 banner.location= classpath:banner.txt # 日志配置 # 日志配置文件的位置. 例如对于Lo ...

  6. css选择器(第n个类选择器)的坑

    css选择器选择第n个子元素,共有两种写法: .parent span:nth-child(n) 选择parent下的第n个子元素(不管前边是不是span,都算在内) .parent span:nth ...

  7. POJ1151 Atlantis 水题 计算几何

    http://poj.org/problem?id=1151 想学一下扫描线线段树,结果写了道水题. #include<iostream> #include<cstdio> # ...

  8. 【推导】zoj3846 GCD Reduce

    题意:给你n个正整数a1...an,一次操作是选择任意两个数ai,aj,将它们都替换成gcd(ai,aj).让你在5n步内将所有数变为1.或者输出不可能. 如果所有数的gcd不为1,显然不可能. 否则 ...

  9. Codeforces Round #298 (Div. 2) B. Covered Path 物理题/暴力枚举

    B. Covered Path Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/534/probl ...

  10. Hihocoder #1081 最短路径一 dijkstra

    #1081 : 最短路径·一 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 万圣节的早上,小Hi和小Ho在经历了一个小时的争论后,终于决定了如何度过这样有意义的一天—— ...