WWF3动态修改工作流<第九篇>

一、动态添加或移除工作流活动

  首先添加一个顺序的空白工作流。

  WWF3动态修改工作流<第九篇>

  然后添加一个Winform程序,界面如下:

  WWF3动态修改工作流<第九篇>

  代码如下:

namespace WinForm

{

    public partial class Form1 : Form

    {

        private WorkflowRuntime workflowRuntime = null;

        private WorkflowInstance workflowInstance = null;

        private WorkflowChanges wfchange = null;



        public Form1()

        {

            InitializeComponent();

            workflowRuntime = new WorkflowRuntime();

            workflowRuntime.StartRuntime();

        }



        private void button1_Click(object sender, EventArgs e)

        {

            Type type = typeof(WorkflowConsoleApplication1.Workflow1);

            workflowInstance = workflowRuntime.CreateWorkflow(type);

            Activity Act = workflowInstance.GetWorkflowDefinition();

            wfchange = new WorkflowChanges(Act);



            CodeActivity code1 = new CodeActivity("codeactivity1");

            code1.ExecuteCode += delegate(object s, EventArgs ea)

            {

                MessageBox.Show("工作流被调用!");

            };

            wfchange.TransientWorkflow.Activities.Insert(0, code1);

        }



        private void button2_Click(object sender, EventArgs e)

        {

            workflowInstance.ApplyWorkflowChanges(wfchange);

            workflowInstance.Start();

        }

    }

}

  效果如下:

  WWF3动态修改工作流<第九篇>

二、动态添加或移除容器活动

  向工作流的容器类型复合活动中动态添加一个子活动。

  添加一个Sequence容器,然后通过代码向其内部动态添加一个Code类型的子活动。

  WWF3动态修改工作流<第九篇>

  添加一个Winform程序,界面不变:

namespace WinForm

{

    public partial class Form1 : Form

    {

        private WorkflowRuntime workflowRuntime = null;

        private WorkflowInstance workflowInstance = null;

        private WorkflowChanges wfchange = null;



        public Form1()

        {

            InitializeComponent();

            workflowRuntime = new WorkflowRuntime();

            workflowRuntime.StartRuntime();

        }



        //添加一个工作流

        private void button1_Click(object sender, EventArgs e)

        {

            Type type = typeof(WorkflowConsoleApplication1.Workflow1);

            workflowInstance = workflowRuntime.CreateWorkflow(type);

            Activity Act = workflowInstance.GetWorkflowDefinition();

            wfchange = new WorkflowChanges(Act);



            //创建一个Code活动

            CodeActivity code1 = new CodeActivity("codeactivity1");

            code1.ExecuteCode += delegate(object s, EventArgs ea)

            {

                MessageBox.Show("sequenceActivity里的Code工作流被调用!");

            };



            //添加工作流到容器中

 SequenceActivity seq = (SequenceActivity)wfchange.TransientWorkflow.Activities["sequenceActivity1"]; seq.Activities.Add(code1);

        }



        //移除一个工作流

        private void button3_Click(object sender, EventArgs e)

        {

            Activity Code1 = wfchange.TransientWorkflow.Activities["codeactivity1"];

 SequenceActivity seq = (SequenceActivity)wfchange.TransientWorkflow.Activities["sequenceActivity1"]; seq.Activities.RemoveAt(0);

        }



        //执行

        private void button2_Click(object sender, EventArgs e)

        {

            workflowInstance.ApplyWorkflowChanges(wfchange);

            workflowInstance.Start();

        }

    }

}

  改动的部分就是红色部分代码,添加删除一个活动一样是Add、Remove。

三、动态修改判断条件

  在WWF提供的各种活动空间中,像IfElse和While这两种基于规则模式的活动是需要设置其逻辑判断条件的。该判断条件分为两种类型,一种是"Code Condition",利用程序代码来定义其逻辑的判断条件,另外一种是"Declarative Rule Condition"。

  首先建立一个顺序类型的工作流项目,然后添加一个IfElse活动到该工作流设计界面,将IfElse活动空间的两条分支分别命名为"IfBranch"和"ElseBranch"。每条分支添加一个Code活动控件。工作流界面如下:

  WWF3动态修改工作流<第九篇>

  将默认的判断条件设置为如下:

  WWF3动态修改工作流<第九篇>

  工作流代码如下:

    public sealed partial class Workflow1 : SequentialWorkflowActivity

    {

        public int condition;

        public int Condition

        {

            get { return condition; }

            set { condition = value; }

        }



        public Workflow1()

        {

            InitializeComponent();

        }



        private void Code1(object sender, EventArgs e)

        {

            MessageBox.Show("If分支被执行!");

        }



        private void Code2(object sender, EventArgs e)

        {

            MessageBox.Show("Else分支被执行!");

        }

    }

  创建一个Winform程序,界面如下:

  WWF3动态修改工作流<第九篇>

  代码如下:

namespace WinForm

{

    public partial class Form1 : Form

    {

        private WorkflowRuntime workflowruntime;

        private WorkflowInstance workflowinstance;



        public Form1()

        {

            InitializeComponent();

            workflowruntime = new WorkflowRuntime();

            workflowruntime.StartRuntime();

        }



        //添加一个工作流

        private void button1_Click(object sender, EventArgs e)

        {

            Dictionary<string, object> parameters = new Dictionary<string, object>();

            parameters.Add("Condition", Convert.ToInt32(this.textBox2.Text));

            Type wftype = typeof(WorkflowConsoleApplication1.Workflow1);

            workflowinstance = workflowruntime.CreateWorkflow(wftype, parameters);

            //WWF对所有运行中的工作流都可以通过"WorkflowChanges"对象来实现修改

            //GetWorkflowDefinition得到工作流活动的集合

            WorkflowChanges workflowchanges = new WorkflowChanges(workflowinstance.GetWorkflowDefinition());

            //将工作流所有的活动进行克隆,克隆出来的对象保存在comactivity中

            CompositeActivity comactivity = workflowchanges.TransientWorkflow;

            //RunleDefinitions类专门用于对".rules"文件进行操作

            RuleDefinitions ruleDefinitions = (RuleDefinitions)comactivity.GetValue(RuleDefinitions.RuleDefinitionsProperty);

            //获取所有的逻辑判断集合

            RuleConditionCollection conditions = ruleDefinitions.Conditions;

            //从Condition对象中获取具体的"Condition1"逻辑判断的信息,"Condition1"以"Declarative Rule Condition"方式定义判断条件的名称

            RuleExpressionCondition condition1 = (RuleExpressionCondition)conditions["Condition1"];

            //对原工作流的condition1逻辑判断条件进行修改

            (condition1.Expression as CodeBinaryOperatorExpression).Right = new CodePrimitiveExpression(Convert.ToInt32(this.textBox1.Text));

            //将修改后的信息应用回工作流实例

            workflowinstance.ApplyWorkflowChanges(workflowchanges);

            //重新启动工作流

            workflowinstance.Start();

        }

    }

}

  运行效果如下:

  WWF3动态修改工作流<第九篇> WWF3动态修改工作流<第九篇>

  留意到判断条件已经完全改为为Winform中的判断条件。

四、动态添加StateActivity活动

  在状态机工作流中同样可以动态加载或修改原有的业务流程。

  首先定义一个接口如下:

    [ExternalDataExchange]

    public interface IClass

    {

        //入党申请

        event EventHandler<ExternalDataEventArgs> AdmittedIntoParty;

        //介绍人意见

        event EventHandler<ExternalDataEventArgs> SponsorCommit;

        //党委会审批

        event EventHandler<ExternalDataEventArgs> PCApproved;

    }

  新建一个状态机工作流如下:

  WWF3动态修改工作流<第九篇>

  前两个EventDriven里面添加两个HandleExternalEvent,并绑定刚刚定义的接口里的事件。

  WWF3动态修改工作流<第九篇>

  新建一个Winform程序如下:

  WWF3动态修改工作流<第九篇>

  从上至下分别是button1、2、3、4。

  代码如下:

namespace WinForm

{

    public partial class Form1 : Form, ClassLibrary1.IClass

    {

        private WorkflowRuntime workflowruntime;

        private WorkflowInstance workflowinstance;

        private ExternalDataExchangeService exterserv;



        public event EventHandler<ExternalDataEventArgs> AdmittedIntoParty;

        public event EventHandler<ExternalDataEventArgs> SponsorCommit;

        public event EventHandler<ExternalDataEventArgs> PCApproved;



        public Form1()

        {

            InitializeComponent();



            workflowruntime = new WorkflowRuntime();

            exterserv = new ExternalDataExchangeService();



            workflowruntime.AddService(exterserv);

            exterserv.AddService(this);



            workflowruntime.StartRuntime();



            Type wftype = typeof(WorkflowConsoleApplication1.Workflow1);

            workflowinstance = workflowruntime.CreateWorkflow(wftype);

            workflowinstance.Start();

        }



        private void Form1_Load(object sender, EventArgs e)

        {

            SetStateComboBox();

        }



        private void SetStateComboBox()

        {

            comboBox1.Items.Clear();



            StateMachineWorkflowInstance StateMachineInstance = new StateMachineWorkflowInstance(workflowruntime, workflowinstance.InstanceId);



            ReadOnlyCollection<StateActivity> states = StateMachineInstance.States;



            foreach (StateActivity allState in states)

            {

                this.comboBox1.Items.Add(allState.Name);

            }

        }



        private void button1_Click(object sender, EventArgs e)

        {

            AdmittedIntoParty(null, new ExternalDataEventArgs(workflowinstance.InstanceId));

            this.button1.Enabled = false;

        }



        private void button2_Click(object sender, EventArgs e)

        {

            Activity root = workflowinstance.GetWorkflowDefinition();

            WorkflowChanges changes = new WorkflowChanges(root);



            //创建一个状态活动

            StateActivity sponsorsubmit = new StateActivity();

            sponsorsubmit.Name = "介绍人提交意见";



            //创建一个EventDrivenActivity

            EventDrivenActivity sponsoreven = new EventDrivenActivity();

            sponsoreven.Name = "SponsorEvent";

            //向状态活动中添加EventDrivenActivity

            sponsorsubmit.Activities.Add(sponsoreven);



            //创建一个HandleExternalEventActivity

            HandleExternalEventActivity sponsorHandle = new HandleExternalEventActivity();

            sponsorHandle.Name = "SponsorHandle";

            sponsorHandle.InterfaceType = typeof(ClassLibrary1.IClass);

            sponsorHandle.EventName = "SponsorCommit";

            //sponsorHandle.Invoked +=new EventHandler<ExternalDataEventArgs>(sponsorHandle_Invoked); 

            //向EventDrivenActivity中添加HandleExternalEventActivity活动

            sponsoreven.Activities.Add(sponsorHandle);



            //向EventDrivenActivity中添加SetStateActivity活动

            SetStateActivity setSponsorapproved = new SetStateActivity();

            //由于工作流是默认命名,所以1和2都已经存在

            setSponsorapproved.Name = "setStateActivity3";

            setSponsorapproved.TargetStateName = "党委会审批";

            sponsoreven.Activities.Add(setSponsorapproved);



            //将状态活动添加进WorkflowChanges

            changes.TransientWorkflow.Activities.Add(sponsorsubmit);



            //将动态加载的活动更新至工作流

            workflowinstance.ApplyWorkflowChanges(changes);



            SetStateComboBox();



            this.button2.Enabled = false;

        }



        private void button3_Click(object sender, EventArgs e)

        {

            StateMachineWorkflowInstance stateInstance = new StateMachineWorkflowInstance(workflowruntime, workflowinstance.InstanceId);

            stateInstance.SetState("介绍人提交意见");



            SponsorCommit(null, new ExternalDataEventArgs(workflowinstance.InstanceId));



            this.button3.Enabled = false;

            this.button2.Enabled = false;

        }



        private void button4_Click(object sender, EventArgs e)

        {

            PCApproved(null, new ExternalDataEventArgs(workflowinstance.InstanceId));

            this.button1.Enabled = false;

            this.button2.Enabled = false;

            this.button4.Enabled = false;

        }

    }

}

  显示结果如下:

  WWF3动态修改工作流<第九篇>

  当点击添加介绍人意见后,整个状态机工作流会在党委审批前,增加一个状态State,介绍人是否已提交意见。

1、取得工作流定义的对象,然后将它作为"WorkflowChanges"对象保存。
2、创建一个State对象,并设置其Name为"介绍人提交意见"。
3、往State内部添加一个EventDriven。
4、往EventDriven里面添加一个HandleExternalEvent子活动。并与接口中定义的事件进行绑定。
5、通过SetStateActivity活动的TargetStateName设置状态间的迁移关系,注意SetStateActivity活动也是EventDriven的子活动,也应该将它添加到EventDriven当中去。
6、将改动应用回工作流。

你可能感兴趣的:(工作流)