`

动态更新活动条件

阅读更多

活动的条件有两种:代码条件和声明性规则条件。如果我们改变了代码条件我们需要重新编译我们的工作流程序才可以。由于声明行规则条件是序列化到.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; }

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

分享到:
评论

相关推荐

    vue+render 实现 动态加载组件 后面会用来做运营活动模板组件

    3. **状态管理**:使用Vuex或其他状态管理工具来管理活动数据和当前活动的状态,确保组件正确地被加载和更新。 4. **路由配置**:结合Vue Router,根据活动ID动态配置路由,确保活动页面的正确跳转和加载。 5. **...

    java活动管理程序.rar

    MyBatis的动态SQL功能使开发者可以根据条件动态生成SQL,减少了大量模板代码。 在功能实现上,活动添加功能允许管理员发布新的活动,包括活动名称、时间、地点等详细信息。评论功能让用户可以对活动发表看法,增强...

    利用simulink生成动态链接库

    【知识点详解】 Simulink是MATLAB环境中的一个强大的建模仿真工具,它允许用户通过图形化界面构建复杂的系统模型。...这种方法在数字样机开发中非常有用,能够有效地测试和验证控制系统在不同条件下的行为。

    贝叶斯动态因子模型

    每次迭代都以当前参数值为条件,从而更新每个参数的取值,最终得到一系列样本,这些样本可以用来近似参数的后验分布。 文章中提到的Markov Chain Monte Carlo方法(马尔可夫链蒙特卡洛方法),是一种基于随机抽样的...

    设备更新最佳时期决策方法研究

    ### 设备更新最佳时期决策方法研究 #### 一、引言 随着技术的进步和市场需求的变化,设备更新成为了企业持续...正确地运用这些决策方法,可以帮助企业在合适的时机进行设备更新,从而确保生产活动的高效性和经济性。

    Excel模板生产动态表.zip

    描述中的内容与标题相同,暗示着压缩包内的“生产动态表.xlsx”可能是一个设计精良的Excel工作簿,用于实时反映生产活动的状态。下面我们将详细探讨Excel在生产管理中的应用及其相关知识点。 **Excel在生产管理中的...

    贝叶斯动态因子模型(方法原理)

    贝叶斯动态因子模型是一种统计方法,用于处理经济数据,并从中提取经济条件的即时度量和预测。该模型特别适用于在面临数据修订或需要单维度经济活动指标时的场景。 首先,贝叶斯动态因子模型采用贝叶斯理论框架对...

    中国电信爱心树活动专题页面模板.zip

    8. **后台管理系统**:模板可能还包含一个后台管理系统,用于管理员监控活动进展、处理捐款、更新活动信息等。后台系统应具有用户管理、数据分析、消息推送等功能,便于活动的高效运营。 综上所述,这个中国电信...

    活动策划-年度合作基础物料报价表.zip

    6. **动态更新**:Excel表格的灵活性允许实时更新数据,当物料价格变动或需求变化时,可以快速调整报价。 7. **公式和函数**:Excel中的公式和函数(如SUM、AVERAGE等)可以帮助快速计算总价、平均价,以及进行成本...

    可更新资源受限的工期-费用权衡问题及粒子群算法.pdf

    【可更新资源受限的工期-费用权衡问题】是指在项目调度中,除了考虑传统的不可更新资源(如人力、设备等)的限制外,还要处理可更新资源(如原材料、能源等)的动态变化和限制。这些可更新资源在项目执行期间可能会...

    漂亮的EXCEL数据统计图表3电商销售活动数据可视化动态看板1.docx

    2. **动态看板**:动态看板通常是指能够实时更新的数据展示面板,这在电商销售管理中非常有用,可以帮助管理者即时了解业务状况,比如每日的销售业绩、库存状况、调货需求等。 3. **时间序列分析**:数据按日期排列...

    煤田复杂地形地质条件岩土勘察实践

    3. 动态实施岩土工程监测:在勘察和工程实施过程中,动态监测岩土体的状态变化,如地表沉降、边坡位移、地下水位等,及时发现和处理问题。 4. 加强煤田地质灾害研究:对可能的地质灾害进行深入研究,并提出针对性的...

    社团管理系统_javascript_社团管理系统_活动管理_活动管理系统_

    系统提供了创建、编辑、删除活动的功能,支持上传活动详情、设定报名条件、时间安排等。同时,活动报名、签到等流程也被自动化,大大减轻了组织者的工作负担。活动管理系统还可以生成统计报告,帮助分析活动参与情况...

    活动预购样式HTML

    它会引用`style.css`来应用样式,并可能通过JavaScript或jQuery来处理动态更新进度条、处理用户交互等逻辑。 总的来说,活动预购样式HTML的设计和实现涉及多方面的Web开发技能,包括HTML语义化、CSS布局与美化以及...

    办公自动化系统中动态工作流研究.pdf

    这种固定的工作流模式难以应对业务流程的动态变化,尤其是业务流程变得越来越复杂、控制步骤和流转规则的不确定性增大,以及业务环境和外部条件频繁变更时,传统的固定工作流往往导致流转失败,使得业务流转停滞或回...

    php开发的网站版投票+抽奖活动系统.zip

    5. 数据统计与展示:投票结果需要实时更新并展示给用户,PHP可以与MySQL等数据库配合,动态生成投票结果图表。 二、抽奖活动设计 1. 抽奖逻辑:抽奖活动的核心是随机算法。PHP的mt_rand()或rand()函数可用于生成...

    土地利用动态监测.ppt

    这一过程涉及到自然环境变化、人类经济活动以及土地资源的多种属性,如数量、利用状况、权属、条件和质量。 自然环境的演变,如全球变暖、海平面上升、植被演替、自然灾害(如荒漠化和崩滑流),这些都会导致土地...

    流程定义更新版本(插入节点、删除节点、修改节点、删除节点恢复)

    其次,"修改节点"意味着用户可以改变现有流程中的步骤或决策属性,例如节点的名称、描述、执行条件等。这样的功能使得流程可以根据业务变化快速适应,提高了流程管理的动态性。 "删除节点"功能则允许用户移除不再...

    android 动态桌面的例子

    3. **更新逻辑**:为了实现动态效果,我们需要在`Engine`的`onComputeFrame()`方法中更新粒子的状态。这可能包括计算新的位置、大小、透明度等属性,以及处理碰撞和边界条件。 4. **性能优化**:由于壁纸会持续运行...

Global site tag (gtag.js) - Google Analytics