• WF规则设计器


    WF规则设计器

    WF的引擎提供了三种启动工作流的方法:

    1. 指定引workFlow的类,这需要引用workFlow的DLL,或将workFlow与引擎放在同一个项目中
    2. 指定引workFlow的xoml文件(动态编译)
    3. 指定workFlow的xoml的字符串

    这三种方式的例子我都写过,各自的优点我也说过,这里就不再描述了,

    本例使用的是第三种,这种的好处是可将xoml字串存入数据库中,要修改流程可以直接对字符串操作,我的一个基于Visio开发的WF的设计器用的就是这种方式生

     

    WF还提供了流程与规则相分离的方式,在启动流程时可以选择一个规则,这样就可以在不修改流程的情况下,通过使用为同的规则调整流程的条件轨迹

    我以前的例子只提供了流程设计器,今天发一个规则设计器的例子

     

     

    WF的规则与规则设计器类结构

     

     

    例子:IfElseBranchActivity、WhileActivity、ConditionedActivityGroup、 ReplicatorActivity的规则编辑器

     

    例子下载:https://files.cnblogs.com/wxwinter/WfEditRule.rar

     

    创建一个工作流

     

    将工作流的rules文件与xoml文件复制到[规则设计器]

     

    启动一下看结果

     

    修改规则

     

     

     

     

     

     

    再启动一下看结果

     

    规则设计器中操作规则的代码

    //从字串得到rules字串得到RuleDefinitions

    private void button3_Click(object sender, EventArgs e)

    {

    System.Text.UTF8Encoding utf8 = new System.Text.UTF8Encoding();

     

     

    byte[] a = utf8.GetBytes(this.rules.Text);

     

    System.IO.MemoryStream m = new System.IO.MemoryStream(a);

     

    XmlReader x = XmlReader.Create(m);

     

    object objectRule = serializer.Deserialize(x);

     

    ruleDefinitions = objectRule as RuleDefinitions;

    this.ruleslist.DisplayMember = "Name";

    this.rulesSetlist.DisplayMember = "Name";

     

     

    // Conditions中的CodeExpression列表

    foreach (var v in ruleDefinitions.Conditions)

    {

    //添加到列表框

    this.ruleslist.Items.Add(v);

    }

     

     

    // RuleSets中的RuleSet列表

    foreach (var v in ruleDefinitions.RuleSets)

    {

    //添加到列表框

    this.rulesSetlist.Items.Add(v);

    }

    }

    // 修改RuleDefinitions的Conditions的CodeExpression规则

    private void button2_Click(object sender, EventArgs e)

    {

    RuleExpressionCondition ruleExpressionCondition = this.ruleslist.SelectedItem as RuleExpressionCondition;

    if (ruleExpressionCondition != null)

    {

    CodeExpression codeExpression = ruleExpressionCondition.Expression;

     

     

    RuleConditionDialog ruleConditionDialog = new RuleConditionDialog(typeof(System.Workflow.ComponentModel.Activity), null, codeExpression);

     

     

    if (ruleConditionDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)

    {

    CodeExpression expression = ruleConditionDialog.Expression;

    RuleExpressionCondition condition = new RuleExpressionCondition(expression);

    RuleValidation validation = new RuleValidation(typeof(System.Workflow.ComponentModel.Activity), null);

    if (condition.Validate(validation))

    {

    ruleExpressionCondition.Expression = ruleConditionDialog.Expression;

    }

    else

    {

    Console.WriteLine("语法有错");

    }

    }

     

    }

    }

    // 为RuleDefinitions的Conditions添加CodeExpression规则

    private void button4_Click(object sender, EventArgs e)

    {

     

    RuleConditionDialog ruleConditionDialog = new RuleConditionDialog(typeof(System.Workflow.ComponentModel.Activity), null, null);

     

     

    if (ruleConditionDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)

    {

    CodeExpression expression = ruleConditionDialog.Expression;

    RuleExpressionCondition condition = new RuleExpressionCondition(expression);

    RuleValidation validation = new RuleValidation(typeof(System.Workflow.ComponentModel.Activity), null);

    if (condition.Validate(validation))

    {

    condition.Name = this.newRulesName.Text;

    this.ruleslist.Items.Add(condition);

     

    }

    else

    {

    Console.WriteLine("语法有错");

    }

    }

    }

    //保存RuleDefinitions到字串得到rules字串得

    private void button5_Click(object sender, EventArgs e)

    {

     

    WorkflowMarkupSerializer serializer = new WorkflowMarkupSerializer();

     

    System.IO.MemoryStream stream=new System.IO.MemoryStream();

     

     

     

    XmlTextWriter writer = new XmlTextWriter(stream, null);

     

    serializer.Serialize(writer, ruleDefinitions);

    writer.Flush();

     

    byte[] by;

     

    by = stream.GetBuffer();

    System.Text.UTF8Encoding utf8 = new System.Text.UTF8Encoding();

    string s = utf8.GetString(by);

    writer.Close();

     

    this.rules.Text = s;

     

    }

     

     

     

  • 相关阅读:
    关键性点位
    【转】Chrome——F12 谷歌开发者工具详解
    LPR-贷款市场报价利率
    盘口-挂单
    看盘
    复盘
    2020超星尔雅后台挂课工具(完全免费)
    Codeup 问题 D: String Subtraction (20)
    维瓦尔第协奏曲《四季》赏析 (Antonio Vavildi 《The Four Seasons》)
    算法4-5:求子串位置的定位函数
  • 原文地址:https://www.cnblogs.com/foundation/p/1210742.html
Copyright © 2020-2023  润新知