WF4.0(2)----设计工作流

简介:

自从做了程序员,发现自己长胖了,而且自己的身体抵抗力也出了问题,最近身体不适,公司工作任务最近也很赶,上次写了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的输出:

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

输出一个Sequence:

1
2
3
4
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将就一下.

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

1
2
3
4
5
6
7
8
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);

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//定义变量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格式,这个时候需要换种写法:

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

  动态活动

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
//定义两个参数
          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);

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

本文转自Fly_Elephant博客园博客,原文链接:http://www.cnblogs.com/xiaofeixiang/p/3975644.html,如需转载请自行联系原作者

相关文章
|
小程序 搜索推荐 安全
【开题报告】基于uniapp的在线蛋糕商城小程序的设计与实现
【开题报告】基于uniapp的在线蛋糕商城小程序的设计与实现
588 0
|
应用服务中间件 Linux nginx
nginx+nginx-http-flv-module
nginx+nginx-http-flv-module
910 1
类加载的常见加载顺序
这段内容是关于Java代码执行顺序的示例。代码展示了类的静态代码块、构造器和局部构造块的执行优先级:静态代码块先于构造器和局部构造块执行,并且只在类加载时运行一次。主函数执行前,会依次看到静态代码块、局部构造块(初始化变量)和构造器的输出。列表中总结了执行顺序和特点。
|
8月前
|
存储 Java 开发者
【潜意识Java】深入详细理解分析Java中的toString()方法重写完整笔记总结,超级详细。
本文详细介绍了 Java 中 `toString()` 方法的重写技巧及其重要
385 10
【潜意识Java】深入详细理解分析Java中的toString()方法重写完整笔记总结,超级详细。
|
11月前
|
安全 关系型数据库 MySQL
Linux下安装mysql8.0(以tar.xz包安装--编译安装)
通过上述步骤,您完成了从下载、编译、安装到配置MySQL 8.0的全过程。此过程虽然较为复杂,但提供了对MySQL安装环境的完全控制,有助于满足特定的部署需求。在实际操作中,根据具体的系统环境,可能还需调整部分步骤或解决未预见的依赖问题。始终参考官方文档和社区资源,保持安装过程与最新版本的兼容性。
4085 68
|
8月前
|
人工智能 运维 Serverless
低成本 Serverless AI 检索介绍和实验
本文介绍了低成本Serverless AI检索技术,分为四部分:1) AI检索介绍,通过电商客服案例展示AI检索的应用和优势;2) 表格存储介绍,详细解释了表格存储的结构化数据处理能力及其在AI检索中的作用;3) 实验:RAG,通过具体实验演示基于表格存储的RAG流程及效果;4) 总结,强调向量检索、易用性和丰富的接口特性。整体内容展示了如何利用Serverless架构实现高效、低成本的AI检索解决方案。
234 9
|
9月前
|
人工智能 关系型数据库 OLAP
通义百炼融合AnalyticDB,10分钟创建网站AI助手
本文介绍了如何在百炼平台上创建和配置AI助手,使其能够准确回答公司产品的相关问题。主要步骤包括:开通管理控制台、创建应用并部署示例网站、配置知识库、上传产品介绍数据、创建AnalyticDB PostgreSQL实例、导入知识文件、启用知识检索增强功能,并最终测试AI助手的回答效果。通过这些步骤,AI助手可以从提供通用信息转变为精准回答特定产品问题。实操完成后,还可以释放实例以节省费用。
301 2
|
人工智能
Suno教程篇:音乐小白也能使用Suno AI零门槛创作音乐?从此只听AI写的歌!
本文是一篇Suno AI音乐创作工具的教程,指导音乐小白如何使用Suno AI零门槛创作音乐,包括准备工作、基础使用、歌曲风格的选择、歌词填入技巧,以及通过实例展示如何为不同场景生成背景音乐。
Suno教程篇:音乐小白也能使用Suno AI零门槛创作音乐?从此只听AI写的歌!
|
数据采集 机器学习/深度学习 人工智能
利用AI技术实现个性化新闻推荐系统
【8月更文挑战第31天】 本文将介绍如何利用AI技术实现一个个性化的新闻推荐系统。我们将使用Python语言和一些常用的机器学习库,如scikit-learn和pandas,来构建一个简单的推荐系统。这个系统可以根据用户的阅读历史和兴趣偏好,为他们推荐相关的新闻文章。我们将从数据预处理、特征提取、模型训练和结果评估等方面进行详细的讲解。
|
人工智能 监控 安全
巧用通义灵码助力护网面试
护网行动是公安部组织的网络安全评估活动,通过模拟攻防演练提升企事业单位安全防护能力。自2016年起,涉及单位逐年增加,网络安全已成为业务保障必需。行动分为红蓝两队,红队模拟攻击,蓝队负责防御。在面试中,蓝队工程师岗位分为初级、中级和高级,要求包括漏洞分析、应急响应和安全设备操作。通义灵码作为AI工具,可用于面试准备,如分析日志、撰写脚本和辅助报告撰写,提高应聘者表现。红队面试侧重实战经验,如渗透测试和漏洞利用,通义灵码也可在代码审查和策略规划上提供帮助。请遵守中国国家网络安全法!!!网络不是法外之地!!!

热门文章

最新文章