活动的条件有两种:代码条件和声明性规则条件。如果我们改变了代码条件我们需要重新编译我们的工作流程序才可以。由于声明行规则条件是序列化到.rules文件中的,所以我们可以动态的更新,下面举例说明:
我们建立一个顺序型工作流控制台程序,工作流设计如下图:
然后分别设置分支条件(均为声明性规则条件)如下:
ifElseBranchActivity1:条件名--ifBranch1,表达式--this.conditonNum == 1。
ifElseBranchActivity2:条件名--ifBranch2,表达式--this.conditonNum == 2。
工作流代码如下:
using System; using System.ComponentModel; using System.ComponentModel.Design; using System.Collections; using System.Drawing; using System.Linq; using System.Workflow.ComponentModel.Compiler; using System.Workflow.ComponentModel.Serialization; using System.Workflow.ComponentModel; using System.Workflow.ComponentModel.Design; using System.Workflow.Runtime; using System.Workflow.Activities; using System.Workflow.Activities.Rules; namespace CaryUpdateCondition { public sealed partial class ConditonWorkflow: SequentialWorkflowActivity { public ConditonWorkflow() { InitializeComponent(); } public int conditonNum { get; set; } private void codeActivity1_ExecuteCode(object sender, EventArgs e) { Console.WriteLine("第一个分支执行了"); } private void codeActivity2_ExecuteCode(object sender, EventArgs e) { Console.WriteLine("第二个分支执行了"); } private void codeActivity3_ExecuteCode(object sender, EventArgs e) { Console.WriteLine("第三个分支执行了"); } } }
我们设计宿主程序如下:
static void Main(string[] args) { using(WorkflowRuntime workflowRuntime = new WorkflowRuntime()) { AutoResetEvent waitHandle = new AutoResetEvent(false); workflowRuntime.WorkflowCompleted += delegate(object sender, WorkflowCompletedEventArgs e)
{waitHandle.Set();}; workflowRuntime.WorkflowTerminated += delegate(object sender, WorkflowTerminatedEventArgs e) { Console.WriteLine(e.Exception.Message); waitHandle.Set(); }; workflowRuntime.WorkflowCreated += new EventHandler<WorkflowEventArgs>
(workflowRuntime_WorkflowCreated); Console.WriteLine("--第一个工作流执行开始--"); Dictionary<String, Object> argNum= new Dictionary<string, object>(); argNum.Add("conditonNum", 1); WorkflowInstance instance = workflowRuntime.CreateWorkflow(typeof
(CaryUpdateCondition.ConditonWorkflow),argNum); instance.Start(); waitHandle.WaitOne(); Console.WriteLine("--第一个工作流执行结束--"); Console.WriteLine(); Console.WriteLine("--第二个工作流执行开始--"); Dictionary<String, Object> argNum2 = new Dictionary<string, object>(); argNum2.Add("conditonNum", 2); WorkflowInstance instance2 = workflowRuntime.CreateWorkflow(typeof
(CaryUpdateCondition.ConditonWorkflow), argNum2); instance2.Start(); waitHandle.WaitOne(); Console.WriteLine("--第二个工作流执行结束--"); } }
如果这个时候我们执行工作流,和我们以前的没什么区别,程序会执行codeActivity1和codeActivity2,我们现在要在运行时动态更改活动的条件,什么时候做更新我们在WF中的动态更新 一文有详细的说明。我们注册WorkflowRuntime的Created事件。在该事件中做更改。代码如下:
private static Boolean firstWF = true;
private static void ModifyRules(WorkflowEventArgs e) { WorkflowChanges wc = new WorkflowChanges(e.WorkflowInstance.GetWorkflowDefinition()); RuleDefinitions rds = (RuleDefinitions)wc.TransientWorkflow.GetValue
(RuleDefinitions.RuleDefinitionsProperty); if (rds != null) { if (rds.Conditions.Contains("ifBranch1")) { RuleExpressionCondition condition= rds.Conditions["ifBranch1"]
as RuleExpressionCondition; CodeBinaryOperatorExpression codeExpression =condition.Expression
as CodeBinaryOperatorExpression; codeExpression.Right = new CodePrimitiveExpression(0); ValidationErrorCollection errors = wc.Validate(); if (errors.Count == 0) { try {e.WorkflowInstance.ApplyWorkflowChanges(wc);} catch (Exception ex) { Console.WriteLine("动态更新异常: {0}",ex.Message); } } else { foreach (ValidationError error in errors) { Console.WriteLine(error.ToString()); } } } } firstWF = false; }
现在我们再次运行程序,由于我们在上面的程序中将ifElseBranchActivity1的条件this.conditonNum == 1。右面
的表达式改为了0,结果如下:
我们在上面的程序中在运行时对ifElseBranchActivity1的条件做了更改,从结果中也看到更改生效,我们还可以在
运行时替换整个.rules文件,这样我们就可以在外部集中管理工作流的规则条件,我们现在将原来的自动生成的.rules
文件拷贝一份,重名为ReplaceRules.rules,然后把该文件中以下部分做更改,同样是将ifElseBranchActivity1
的条件this.conditonNum == 1,右面的表达式改为了0:
<ns0:CodeBinaryOperatorExpression.Right> <ns0:CodePrimitiveExpression> <ns0:CodePrimitiveExpression.Value> <ns1:Int32 xmlns:ns1="clr-namespace:System;Assembly=mscorlib, Version=2.0.0.0,
Culture=neutral, PublicKeyToken=b77a5c561934e089">0</ns1:Int32> </ns0:CodePrimitiveExpression.Value> </ns0:CodePrimitiveExpression> </ns0:CodeBinaryOperatorExpression.Right>
实际中我们不会这样做,我们会通过规则编辑器来设置我们的规则,我们在运行时替换该规则文件,程序如下:
private static void ReplaceRules(WorkflowEventArgs e) { WorkflowChanges wc = new WorkflowChanges(e.WorkflowInstance.GetWorkflowDefinition()); Stream stream = new FileStream(@"ReplaceRules.rules", FileMode.Open,
FileAccess.Read, FileShare.Read); using (XmlReader xmlReader = XmlReader.Create( new StreamReader(stream))) { WorkflowMarkupSerializer markupSerializer= new WorkflowMarkupSerializer(); RuleDefinitions ruleDefinitions= markupSerializer.Deserialize(xmlReader)
as RuleDefinitions; if (ruleDefinitions != null) { wc.TransientWorkflow.SetValue(RuleDefinitions.RuleDefinitionsProperty,ruleDefinitions); ValidationErrorCollection errors = wc.Validate(); if (errors.Count == 0) { try { e.WorkflowInstance.ApplyWorkflowChanges(wc);} catch (Exception ex) { Console.WriteLine("动态更新异常: {0}",ex.Message); } } else { foreach (ValidationError error in errors) { Console.WriteLine(error.ToString()); } } } } firstWF = false; }
发表评论
-
平淡的2007
2007-12-24 08:04 785早上起来,送女朋友去公交车站,然后回来赶紧打开电脑,先 ... -
DreamSpark发布,高校学生免费使用Visual Studio 2008 Professional Edition 等微软软件
2008-02-20 13:23 1381今天上网无意中搜索到学生可以免费使用VS2008专业版,后来又 ... -
坚持学习WF(1):从HelloWorld开始
2008-04-04 16:30 849[置顶]坚持学习WF文章索 ... -
坚持学习WF(2):WF创作模式和设计时工具
2008-04-05 17:19 600[置顶]坚持学习WF文章索 ... -
坚持学习WF(3):WF框架概览
2008-04-08 07:27 736[置顶]坚持学习WF文章索 ... -
坚持学习WF(4):活动(Activity)和依赖属性(DependencyProperty)
2008-04-12 00:01 1103[置顶]坚持学习WF文章索引 活动(Activity) 活动 ... -
坚持学习WF(5):自定义活动(CustomActivity)
2008-04-13 15:25 882当WF提供的标准活动不能满足我们的需求的时候,我们就需要定义自 ... -
MOSS点滴(1):如何开发和部署feature
2008-04-16 21:35 807Features 是MOSS 2007以开箱即用的一套新功能, ... -
MOSS点滴(2):自定义Application Page
2008-04-19 20:07 810在MOSS中后台管理的页面都是Application Pag ... -
坚持学习WF(6):开发可复用的宿主程序
2008-04-21 21:45 661我们之前写工作流宿主 ... -
MOSS点滴(3):说说MOSS中的母版页
2008-04-25 21:15 1137MOSS中有两种页面:Site P ... -
MOSS点滴(4):实现Form认证
2008-04-29 21:12 666本文主要参考了网上的一些文章,但有些文章有些地方说的不是很明确 ... -
坚持学习WF(7):流程控制(Flow Control)
2008-04-30 18:10 774本文主要说说WF中和流 ... -
坚持学习WF(8):本地服务之调用外部方法
2008-05-09 08:17 719WF提供了一组核心服务 ... -
MOSS中的WebPart开发
2008-05-10 13:53 1025由于在asp.net1.1的时候asp.net中还没有webp ... -
坚持学习WF(9):本地服务之事件处理
2008-05-28 07:49 764[置顶]坚持学习WF文章索引 一:先来介绍两个活动 Even ... -
坚持学习WF(10):在工作流中使用关联
2008-06-01 13:03 659[置顶]坚持学习WF文章索 ... -
坚持学习WF(11):工作流通信与队列
2008-06-07 15:45 692[置顶]坚持学习WF文章索引 WF 提供的通信模型是构建于 ... -
MOSS中创建自定义内容类型
2008-06-12 20:23 1069一:简要介绍 某类内容 ... -
.NET中IDisposable接口的基本使用
2008-06-15 12:01 908首先来看MSDN中关于这个接口的说明: [ComVisible ...
相关推荐
更新动态: 版本号:8.6.3 – 旗舰版_多规格_多红包_溯源分销 更新上版本内容,限制朋友圈红包 版本号:8.6.2 – 旗舰版_多规格_多红包_溯源分销 1、分享朋友圈红包增加限制条件:是否限制仅给参加活动的用户; 2、...
页面重置时,搜索列表将动态更新。 5天预测会记录当日以下连续几天的预测,并显示以下信息: 日期 温度 天气图标图 湿度 用法: 诸如此类的天气仪表板对我们的日常生活至关重要。 它们提供了有价值的信息,使...
它具有响应式界面自适应和由 JavaScript 代码提供支持的动态更新的 HTML 和 CSS,可用于跟踪工作日上午 9 点到下午 5 点的待办事项。目录:先决条件: 您将需要 Internet 连接和浏览器来查看应用程序。 用法: 这是...
数据库设计包括校友信息表、动态信息表、活动信息表等,保证数据的完整性和安全性,同时支持快速查询和更新操作。 校友信息管理与交流: 提供校友信息录入和管理功能,校友可以完善自己的个人信息,并选择性地公开...
电子商务的发展和市场竞争的加剧将企业推上了风口浪尖,中小企业除了积极迎接挑战之外,别无选择。...所谓的动态性就是能动态更新内容,如更新库存信息、进货信息和出货信息等,这要求与数据库有良好的连接; 2)一
个人动态更新输入框更加明显和易用,更新状态更加方便; 查找好友进行多项分类,用户可以选择查找同事、查找老乡等进行搜索; 好友热度可以自行调节; 默认打招呼内容可以预先设置; 有奖任务继续增强,优化重复...
个人动态更新输入框更加明显和易用,更新状态更加方便; 查找好友进行多项分类,用户可以选择查找同事、查找老乡等进行搜索; 好友热度可以自行调节; 默认打招呼内容可以预先设置; 有奖任务继续增强,优化重复...
个人动态更新输入框更加明显和易用,更新状态更加方便; 查找好友进行多项分类,用户可以选择查找同事、查找老乡等进行搜索; 好友热度可以自行调节; 默认打招呼内容可以预先设置; 有奖任务继续增强,优化重复执行...
个人动态更新输入框更加明显和易用,更新状态更加方便; 查找好友进行多项分类,用户可以选择查找同事、查找老乡等进行搜索; 好友热度可以自行调节; 默认打招呼内容可以预先设置; 有奖任务继续增强,优化重复...
个人动态更新输入框更加明显和易用,更新状态更加方便; 查找好友进行多项分类,用户可以选择查找同事、查找老乡等进行搜索; 好友热度可以自行调节; 默认打招呼内容可以预先设置; 有奖任务继续增强,优化重复执行...
个人动态更新输入框更加明显和易用,更新状态更加方便; 查找好友进行多项分类,用户可以选择查找同事、查找老乡等进行搜索; 好友热度可以自行调节; 默认打招呼内容可以预先设置; 有奖任务继续增强,优化重复...
个人动态更新输入框更加明显和易用,更新状态更加方便; 查找好友进行多项分类,用户可以选择查找同事、查找老乡等进行搜索; 好友热度可以自行调节; 默认打招呼内容可以预先设置; 有奖任务继续增强,优化重复执行...
个人动态更新输入框更加明显和易用,更新状态更加方便; 查找好友进行多项分类,用户可以选择查找同事、查找老乡等进行搜索; 好友热度可以自行调节; 默认打招呼内容可以预先设置; 有奖任务继续增强,优化重复...
个人动态更新输入框更加明显和易用,更新状态更加方便; 查找好友进行多项分类,用户可以选择查找同事、查找老乡等进行搜索; 好友热度可以自行调节; 默认打招呼内容可以预先设置; 有奖任务继续增强,优化重复...
个人动态更新输入框更加明显和易用,更新状态更加方便; 查找好友进行多项分类,用户可以选择查找同事、查找老乡等进行搜索; 好友热度可以自行调节; 默认打招呼内容可以预先设置; 有奖任务继续增强,优化重复...
持续更新时间参数 189 结束时间或管理器接收时间 189 在活动频道中排序 190 使用标准内容中的“实时”频道 190 i/o 子系统性能 190 诊断: 从基本频道特性开始 191 自定义列 191 创建自定义列 191 显示自定义列 192 ...
【触发条件】 触发条件,一个活动的触发条件。 3 用户业务现状 3.1 组织结构和职责 3.1.1 组织结构 3.1.2 岗位职责 ⑴.采购工作岗: ①.负责股份公司生产所需的物资供应。 ②.负责采购物资的质量、数量,做到货...
系统的架构设计注重性能、可用性和可维护性,以支持高并发的数据访问和动态的数据更新。其模块化的设计也便于未来根据非遗文化的发展增加新功能或升级现有功能,确保软件的长期适用性和技术前瞻性。
2. 团购活动发布:团购组织者可以发布即将进行的团购活动信息,包括商品详情和购买条件。 3. 订单处理:用户可以创建订单并选择希望购买的商品数量,同时支持订单的跟踪和历史查询。 4. 支付系统集成:整合在线...
敬业签V2.5.2更新日志1、上线双11活动,活动期间新用户首次购买会员商品,享受买1送1活动2、双11当天(11月11日)所有商品享受买一送一,不限条件,都可参与3、开售白银会员,每月3元,年付30元,拥有免广告和自定义...