`

动态更新活动条件

阅读更多

活动的条件有两种:代码条件和声明性规则条件。如果我们改变了代码条件我们需要重新编译我们的工作流程序才可以。由于声明行规则条件是序列化到.rules文件中的,所以我们可以动态的更新,下面举例说明:

我们建立一个顺序型工作流控制台程序,工作流设计如下图:

Condition1

然后分别设置分支条件(均为声明性规则条件)如下:
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,结果如下:
Condition2 
我们在上面的程序中在运行时对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; }

运行程序后我们会得到和上面同样的结果。

分享到:
评论

相关推荐

    功能模块 新品拼团源码V8.6.3

    更新动态: 版本号:8.6.3 – 旗舰版_多规格_多红包_溯源分销 更新上版本内容,限制朋友圈红包 版本号:8.6.2 – 旗舰版_多规格_多红包_溯源分销 1、分享朋友圈红包增加限制条件:是否限制仅给参加活动的用户; 2、...

    KCWeatherApp:天气状况搜索仪表板,该仪表板利用(API)应用程序编程接口将数据提取到浏览器中,并具有由jQuery支持的动态更新HTML和CSS

    页面重置时,搜索列表将动态更新。 5天预测会记录当日以下连续几天的预测,并显示以下信息: 日期 温度 天气图标图 湿度 用法: 诸如此类的天气仪表板对我们的日常生活至关重要。 它们提供了有价值的信息,使...

    WorkDayCalenderFifthEdition:创建一个简单的日历应用程序,允许用户保存一天中每个小时的事件。 此应用程序将在浏览器中运行,并具有由 jQuery 提供支持的动态更新的 HTML 和 CSS。 您需要使用 [Moment.js](https

    它具有响应式界面自适应和由 JavaScript 代码提供支持的动态更新的 HTML 和 CSS,可用于跟踪工作日上午 9 点到下午 5 点的待办事项。目录:先决条件: 您将需要 Internet 连接和浏览器来查看应用程序。 用法: 这是...

    基于微信小程序的校友会系统的实现+ssm框架.rar

    数据库设计包括校友信息表、动态信息表、活动信息表等,保证数据的完整性和安全性,同时支持快速查询和更新操作。 校友信息管理与交流: 提供校友信息录入和管理功能,校友可以完善自己的个人信息,并选择性地公开...

    毕业设计:小型企业办公耗材库存管理软件的设计与实现(源代码)

    电子商务的发展和市场竞争的加剧将企业推上了风口浪尖,中小企业除了积极迎接挑战之外,别无选择。...所谓的动态性就是能动态更新内容,如更新库存信息、进货信息和出货信息等,这要求与数据库有良好的连接; 2)一

    UCenter Home v2.0 简体中文GBK.zip

    个人动态更新输入框更加明显和易用,更新状态更加方便; 查找好友进行多项分类,用户可以选择查找同事、查找老乡等进行搜索; 好友热度可以自行调节; 默认打招呼内容可以预先设置; 有奖任务继续增强,优化重复...

    UCenter Home v2.0 繁体中文UTF-8.zip

    个人动态更新输入框更加明显和易用,更新状态更加方便; 查找好友进行多项分类,用户可以选择查找同事、查找老乡等进行搜索; 好友热度可以自行调节; 默认打招呼内容可以预先设置; 有奖任务继续增强,优化重复...

    UCenter Home v2.0 简体中文 GBK.zip

    个人动态更新输入框更加明显和易用,更新状态更加方便; 查找好友进行多项分类,用户可以选择查找同事、查找老乡等进行搜索; 好友热度可以自行调节; 默认打招呼内容可以预先设置; 有奖任务继续增强,优化重复执行...

    UCenter Home v2.0 简体中文UTF-8.zip

    个人动态更新输入框更加明显和易用,更新状态更加方便; 查找好友进行多项分类,用户可以选择查找同事、查找老乡等进行搜索; 好友热度可以自行调节; 默认打招呼内容可以预先设置; 有奖任务继续增强,优化重复...

    UCenter Home v2.0 繁体中文 UTF-8.zip

    个人动态更新输入框更加明显和易用,更新状态更加方便; 查找好友进行多项分类,用户可以选择查找同事、查找老乡等进行搜索; 好友热度可以自行调节; 默认打招呼内容可以预先设置; 有奖任务继续增强,优化重复执行...

    UCenter Home v2.0 繁体中文BIG5.zip

    个人动态更新输入框更加明显和易用,更新状态更加方便; 查找好友进行多项分类,用户可以选择查找同事、查找老乡等进行搜索; 好友热度可以自行调节; 默认打招呼内容可以预先设置; 有奖任务继续增强,优化重复...

    UCenter Home v2.0 繁体中文 BIG5.zip

    个人动态更新输入框更加明显和易用,更新状态更加方便; 查找好友进行多项分类,用户可以选择查找同事、查找老乡等进行搜索; 好友热度可以自行调节; 默认打招呼内容可以预先设置; 有奖任务继续增强,优化重复执行...

    UCenter Home 2.0 简体中文UTF8.zip

    个人动态更新输入框更加明显和易用,更新状态更加方便; 查找好友进行多项分类,用户可以选择查找同事、查找老乡等进行搜索; 好友热度可以自行调节; 默认打招呼内容可以预先设置; 有奖任务继续增强,优化重复...

    UCenter Home 2.0 简体中文GBK.zip

    个人动态更新输入框更加明显和易用,更新状态更加方便; 查找好友进行多项分类,用户可以选择查找同事、查找老乡等进行搜索; 好友热度可以自行调节; 默认打招呼内容可以预先设置; 有奖任务继续增强,优化重复...

    UCenter Home 2.0 繁体中文UTF8.zip

    个人动态更新输入框更加明显和易用,更新状态更加方便; 查找好友进行多项分类,用户可以选择查找同事、查找老乡等进行搜索; 好友热度可以自行调节; 默认打招呼内容可以预先设置; 有奖任务继续增强,优化重复...

    ESM_ArcSight控制台用户指南(中文翻译版—Zephyr)_6.11.0 .pdf

    持续更新时间参数 189 结束时间或管理器接收时间 189 在活动频道中排序 190 使用标准内容中的“实时”频道 190 i/o 子系统性能 190 诊断: 从基本频道特性开始 191 自定义列 191 创建自定义列 191 显示自定义列 192 ...

    ERP5.0采购管理系统需求规格说明书

    【触发条件】 触发条件,一个活动的触发条件。 3 用户业务现状 3.1 组织结构和职责 3.1.1 组织结构 3.1.2 岗位职责 ⑴.采购工作岗: ①.负责股份公司生产所需的物资供应。 ②.负责采购物资的质量、数量,做到货...

    SpringBoot项目甘肃非物质文化网站的设计与开发.zip

    系统的架构设计注重性能、可用性和可维护性,以支持高并发的数据访问和动态的数据更新。其模块化的设计也便于未来根据非遗文化的发展增加新功能或升级现有功能,确保软件的长期适用性和技术前瞻性。

    SpringBoot项目小区团购管理.zip

    2. 团购活动发布:团购组织者可以发布即将进行的团购活动信息,包括商品详情和购买条件。 3. 订单处理:用户可以创建订单并选择希望购买的商品数量,同时支持订单的跟踪和历史查询。 4. 支付系统集成:整合在线...

    敬业签电脑和手机云同步桌面便签 v2.5.2

    敬业签V2.5.2更新日志1、上线双11活动,活动期间新用户首次购买会员商品,享受买1送1活动2、双11当天(11月11日)所有商品享受买一送一,不限条件,都可参与3、开售白银会员,每月3元,年付30元,拥有免广告和自定义...

Global site tag (gtag.js) - Google Analytics