zoukankan      html  css  js  c++  java
  • 通过AEC解读WF的核心原理(八)实现Switch功能的Activity

    说明

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

     

    本例与IfElseActivity的功能很像,本例的条件判断提供了两种方式,

    1. Condition方式,这与IfElseActivity的一样,通过[条件分支.规则条件]属性设置
    2. 提供了与Switch风格的条件判断方式,,通过[条件分支.条件]属性与[条件容器.分支表达式]设置

    具体操作见[测试用工作流]的图片说明

     

    本例还演示了使用Designer的技巧:

     

    例子

    条件分支Activity

    public class 条件分支 : SequenceActivity

    {

    public static DependencyProperty 规则条件Property = DependencyProperty.Register("规则条件", typeof(ActivityCondition), typeof(条件分支));

     

    public ActivityCondition 规则条件

    {

    get

    {

    return ((ActivityCondition)(base.GetValue(条件分支.规则条件Property)));

    }

    set

    {

    base.SetValue(条件分支.规则条件Property, value);

    }

    }

     

    public static DependencyProperty 条件Property = DependencyProperty.Register("条件", typeof(string), typeof(条件分支), new PropertyMetadata(""));

     

    public string 条件

    {

    get

    {

    return ((string)(base.GetValue(条件分支.条件Property)));

    }

    set

    {

    base.SetValue(条件分支.条件Property, value);

    }

    }

     

    }

     

    条件容器设计器

    public class 条件容器设计器 : ParallelActivityDesigner

    {

    protected override System.Workflow.ComponentModel.CompositeActivity OnCreateNewBranch()

    {

    return new 条件分支();

    }

    }

     

    条件容器Activity

     

    [Designer(typeof(条件容器设计器), typeof(IDesigner))]

    public class 条件容器 : CompositeActivity, IActivityEventListener<ActivityExecutionStatusChangedEventArgs>

    {

    public 条件容器()

    {

    InitializeComponent();

    }

    [System.Diagnostics.DebuggerNonUserCode]

    private void InitializeComponent()

    {

    this.CanModifyActivities = true;

    this.Name = "条件容器";

    this.CanModifyActivities = false;

    }

     

    public static readonly DependencyProperty 分支表达式Property = DependencyProperty.Register("分支表达式", typeof(string), typeof(条件容器), new PropertyMetadata(""));

     

    public string 分支表达式

    {

    get { return (string)GetValue(分支表达式Property); }

    set { SetValue(分支表达式Property, value); }

    }

     

    protected override ActivityExecutionStatus Execute(ActivityExecutionContext executionContext)

    {

    foreach (条件分支 branch in EnabledActivities)

    {

    if (branch.规则条件 != null)

    {

    if (branch.规则条件.Evaluate(branch, executionContext))

    {

    branch.RegisterForStatusChange(Activity.ClosedEvent, this);

    executionContext.ExecuteActivity(branch);

    }

    continue;

    }

     

    if (branch.条件 == this.分支表达式)

    {

    branch.RegisterForStatusChange(Activity.ClosedEvent, this);

    executionContext.ExecuteActivity(branch);

    }

    }

    return ActivityExecutionStatus.Executing;

    }

     

    public void OnEvent(object sender, ActivityExecutionStatusChangedEventArgs e)

    {

    ActivityExecutionContext aec = sender as ActivityExecutionContext;

    条件分支 branch = e.Activity as 条件分支;

    if (branch != null)

    {

    branch.UnregisterForStatusChange(Activity.ClosedEvent, this);

    }

     

    foreach (Activity child in this.EnabledActivities)

    {

    if (child.ExecutionStatus != ActivityExecutionStatus.Closed

    && child.ExecutionStatus != ActivityExecutionStatus.Initialized)

    {

    return;

    }

    }

    aec.CloseActivity();

    }

    }

     

    测试用工作流

     

     

     

    public class Workflow1: SequentialWorkflowActivity

    {

    private 条件分支 条件分支2;

    private 条件分支 条件分支1;

    private CodeActivity codeActivity3;

    private CodeActivity codeActivity2;

    private CodeActivity codeActivity1;

    private 条件分支 条件分支3;

    private CodeActivity codeActivity5;

    private CodeActivity codeActivity4;

    private 条件分支 条件分支5;

    private 条件分支 条件分支4;

    private 条件容器 条件容器2;

    private 条件容器 条件容器1;

     

            public Workflow1()

            {

                InitializeComponent();

            }

    [System.Diagnostics.DebuggerNonUserCode]

    private void InitializeComponent()

    {

    this.CanModifyActivities = true;

    System.Workflow.Activities.Rules.RuleConditionReference ruleconditionreference1 = new System.Workflow.Activities.Rules.RuleConditionReference();

    this.codeActivity5 = new System.Workflow.Activities.CodeActivity();

    this.codeActivity4 = new System.Workflow.Activities.CodeActivity();

    this.codeActivity3 = new System.Workflow.Activities.CodeActivity();

    this.codeActivity2 = new System.Workflow.Activities.CodeActivity();

    this.codeActivity1 = new System.Workflow.Activities.CodeActivity();

    this.条件分支5 = new wxwinterAecTest.条件分支();

    this.条件分支4 = new wxwinterAecTest.条件分支();

    this.条件分支3 = new wxwinterAecTest.条件分支();

    this.条件分支2 = new wxwinterAecTest.条件分支();

    this.条件分支1 = new wxwinterAecTest.条件分支();

    this.条件容器2 = new wxwinterAecTest.条件容器();

    this.条件容器1 = new wxwinterAecTest.条件容器();

    //

    // codeActivity5

    //

    this.codeActivity5.Name = "codeActivity5";

    this.codeActivity5.ExecuteCode += new System.EventHandler(this.codeActivity5_ExecuteCode);

    //

    // codeActivity4

    //

    this.codeActivity4.Name = "codeActivity4";

    this.codeActivity4.ExecuteCode += new System.EventHandler(this.codeActivity4_ExecuteCode);

    //

    // codeActivity3

    //

    this.codeActivity3.Name = "codeActivity3";

    this.codeActivity3.ExecuteCode += new System.EventHandler(this.codeActivity3_ExecuteCode);

    //

    // codeActivity2

    //

    this.codeActivity2.Name = "codeActivity2";

    this.codeActivity2.ExecuteCode += new System.EventHandler(this.codeActivity2_ExecuteCode);

    //

    // codeActivity1

    //

    this.codeActivity1.Name = "codeActivity1";

    this.codeActivity1.ExecuteCode += new System.EventHandler(this.codeActivity1_ExecuteCode);

    //

    // 条件分支5

    //

    this.条件分支5.Activities.Add(this.codeActivity5);

    this.条件分支5.Name = "条件分支5";

    this.条件分支5.条件 = "wxd";

    this.条件分支5.规则条件 = null;

    //

    // 条件分支4

    //

    this.条件分支4.Activities.Add(this.codeActivity4);

    this.条件分支4.Name = "条件分支4";

    this.条件分支4.条件 = "lzm";

    this.条件分支4.规则条件 = null;

    //

    // 条件分支3

    //

    this.条件分支3.Activities.Add(this.codeActivity3);

    this.条件分支3.Name = "条件分支3";

    this.条件分支3.条件 = "lzm";

    this.条件分支3.规则条件 = null;

    //

    // 条件分支2

    //

    this.条件分支2.Activities.Add(this.codeActivity2);

    this.条件分支2.Name = "条件分支2";

    this.条件分支2.条件 = "";

    ruleconditionreference1.ConditionName = "条件2";

    this.条件分支2.规则条件 = ruleconditionreference1;

    //

    // 条件分支1

    //

    this.条件分支1.Activities.Add(this.codeActivity1);

    this.条件分支1.Name = "条件分支1";

    this.条件分支1.条件 = "wxwinter";

    this.条件分支1.规则条件 = null;

    //

    // 条件容器2

    //

    this.条件容器2.Activities.Add(this.条件分支4);

    this.条件容器2.Activities.Add(this.条件分支5);

    this.条件容器2.Name = "条件容器2";

    this.条件容器2.分支表达式 = "lzm";

    //

    // 条件容器1

    //

    this.条件容器1.Activities.Add(this.条件分支1);

    this.条件容器1.Activities.Add(this.条件分支2);

    this.条件容器1.Activities.Add(this.条件分支3);

    this.条件容器1.Name = "条件容器1";

    this.条件容器1.分支表达式 = "wxwinter";

    //

    // Workflow1

    //

    this.Activities.Add(this.条件容器1);

    this.Activities.Add(this.条件容器2);

    this.Name = "Workflow1";

    this.CanModifyActivities = false;

     

    }

     

    private void codeActivity1_ExecuteCode(object sender, EventArgs e)

    {

    System.Console.WriteLine("codeActivity1");

    }

     

    private void codeActivity2_ExecuteCode(object sender, EventArgs e)

    {

    System.Console.WriteLine("codeActivity2");

    }

     

    private void codeActivity3_ExecuteCode(object sender, EventArgs e)

    {

    System.Console.WriteLine("codeActivity3");

    }

     

    private void codeActivity4_ExecuteCode(object sender, EventArgs e)

    {

    System.Console.WriteLine("codeActivity4");

    }

     

    private void codeActivity5_ExecuteCode(object sender, EventArgs e)

    {

    System.Console.WriteLine("codeActivity5");

    }

        }

    <RuleDefinitions xmlns="http://schemas.microsoft.com/winfx/2006/xaml/workflow">

        <RuleDefinitions.Conditions>

            <RuleExpressionCondition Name="条件2">

                <RuleExpressionCondition.Expression>

                    <ns0:CodeBinaryOperatorExpression Operator="ValueEquality" xmlns:ns0="clr-namespace:System.CodeDom;Assembly=System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">

                        <ns0:CodeBinaryOperatorExpression.Left>

                            <ns0:CodePropertyReferenceExpression PropertyName="分支表达式">

                                <ns0:CodePropertyReferenceExpression.TargetObject>

                                    <ns0:CodeFieldReferenceExpression FieldName="条件容器1">

                                        <ns0:CodeFieldReferenceExpression.TargetObject>

                                            <ns0:CodeThisReferenceExpression />

                                        </ns0:CodeFieldReferenceExpression.TargetObject>

                                    </ns0:CodeFieldReferenceExpression>

                                </ns0:CodePropertyReferenceExpression.TargetObject>

                            </ns0:CodePropertyReferenceExpression>

                        </ns0:CodeBinaryOperatorExpression.Left>

                        <ns0:CodeBinaryOperatorExpression.Right>

                            <ns0:CodePrimitiveExpression>

                                <ns0:CodePrimitiveExpression.Value>

                                    <ns1:String xmlns:ns1="clr-namespace:System;Assembly=mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">wxwinter</ns1:String>

                                </ns0:CodePrimitiveExpression.Value>

                            </ns0:CodePrimitiveExpression>

                        </ns0:CodeBinaryOperatorExpression.Right>

                    </ns0:CodeBinaryOperatorExpression>

                </RuleExpressionCondition.Expression>

            </RuleExpressionCondition>

        </RuleDefinitions.Conditions>

    </RuleDefinitions>

     

    宿主

    class Program

    {

    static void Main()

    {

    WorkflowRuntime workflowRuntime = new WorkflowRuntime();

    workflowRuntime.WorkflowCompleted +=new EventHandler<WorkflowCompletedEventArgs>(workflowRuntime_WorkflowCompleted);

    workflowRuntime.WorkflowTerminated +=new EventHandler<WorkflowTerminatedEventArgs>(workflowRuntime_WorkflowTerminated);

    workflowRuntime.WorkflowIdled+=new EventHandler<WorkflowEventArgs>(workflowRuntime_WorkflowIdled);

    WorkflowInstance instance = workflowRuntime.CreateWorkflow(typeof(Workflow1));

    instance.Start();

     

    System.Console.Read();

     

    }

     

    static void workflowRuntime_WorkflowIdled(object sender, WorkflowEventArgs e)

    {

    System.Console.WriteLine("WorkflowIdled");

    }

     

    static void workflowRuntime_WorkflowTerminated(object sender, WorkflowTerminatedEventArgs e)

    {

    System.Console.WriteLine("Terminated" + e.Exception.Message);

    }

     

    static void workflowRuntime_WorkflowCompleted(object sender, WorkflowCompletedEventArgs e)

    {

    System.Console.WriteLine("WorkflowCompleted");

    }

     

    }

     

    运行结果

     

     

  • 相关阅读:
    WebView(网页视图)基本用法
    Android——ProgressBar(进度条)
    第一阶段任务
    第七周学习总结
    (HDU)1095 --A+B for Input-Output Practice (VII)(输入输出练习(VII))
    (HDU)1094 --A+B for Input-Output Practice (VI)(输入输出练习(VI))
    (HDU)1093 --A+B for Input-Output Practice (V)(输入输出练习(V))
    (HDU)1092 --A+B for Input-Output Practice (IV)(输入输出练习(IV))
    (HDU)1091 --A+B for Input-Output Practice (III)(输入输出练习(III))
    (HDU)1090 --A+B for Input-Output Practice (II)(输入输出练习(II))
  • 原文地址:https://www.cnblogs.com/foundation/p/1217344.html
Copyright © 2011-2022 走看看