• 通过AEC解读WF的核心原理(十三完)实现Visio设计风格的Activity


    通过AEC解读WF的核心原理(十三完)实现Visio设计风格的Activity

     

     

    AEC,是ActivityExecutionContext 对像,也是 Activity Execution Context

    本系列以ActivityExecutionContext 对像为主线,通过以自定义Activity为例子演示了控制Activity内部执行的一些技巧。如果真正的读懂了本文,就能更好的理解WF工具栏中自带Activity的,并重新实现其功能。

    实际上,如果开发业务工作流,直接用WF工具栏中自带Activity拼装会使流程显得很臃肿,而状态机与顺序工作流其实也不过是WF为我们提供的两个简单的Activity执行控制模板而以,WF只的两个Activity,(System.Workflow.ComponentModel.Activity与System.Workflow.ComponentModel.CompositeActivity),它们是活动树上的叶节点与支节点,当你直正理解了这些你会发现让人眼花缭乱的WF背后是如此清爽幽雅,WF仿佛在一个全新的空间再现了计算机工作原理,指令、地址、数据、出栈、入栈.........

     

    最后以一个简单的例子结束本系例:

    实现Visio设计风格的Activity

    先看一下我的一个项目中的效果

     

    下面是一个按连接线顺序调用的例子

    https://files.cnblogs.com/wxwinter/AEC13.rar

    结点Activity

    public class 结点: Activity

        {

    public Activity 上一结点

    { set; get; }

    public Activity 下一结点

    { set; get; }

     

     

     

    protected override ActivityExecutionStatus Execute(ActivityExecutionContext executionContext)

    {

    System.Console.WriteLine(this.Name);

    return ActivityExecutionStatus.Closed;

    }

        }

     

    容器Designer

    public class wxwinterDesigner : FreeformActivityDesigner

    {

    public wxwinterDesigner()

    {

    this.ConnectorAdded += new ConnectorEventHandler(wxwinterDesigner_ConnectorAdded);

    this.ConnectorChanged += new ConnectorEventHandler(wxwinterDesigner_ConnectorChanged);

    this.ConnectorRemoved += new ConnectorEventHandler(wxwinterDesigner_ConnectorRemoved);

    }

     

    void wxwinterDesigner_ConnectorChanged(object sender, ConnectorEventArgs e)

    {

    结点 s = e.Connector.Source.AssociatedDesigner.Activity as 结点;

    结点 t = e.Connector.Target.AssociatedDesigner.Activity as 结点;

     

    s.下一结点 = t;

    t.上一结点 = s;

     

    }

     

    void wxwinterDesigner_ConnectorRemoved(object sender, ConnectorEventArgs e)

    {

    结点 s = e.Connector.Source.AssociatedDesigner.Activity as 结点;

    结点 t = e.Connector.Target.AssociatedDesigner.Activity as 结点;

     

    t.上一结点 =null ;

    s.下一结点 =null;

    }

     

    void wxwinterDesigner_ConnectorAdded(object sender, ConnectorEventArgs e)

    {

    结点 s = e.Connector.Source.AssociatedDesigner.Activity as 结点;

    结点 t = e.Connector.Target.AssociatedDesigner.Activity as 结点;

    s.下一结点 = t;

    t.上一结点 = s;

    }

    }

     

    容器Activity

    [Designer(typeof(wxwinterDesigner), typeof(IDesigner))]

        public class 容器: SequenceActivity

        {

    public 结点 开始结点

    { set; get; }

     

     

    protected override ActivityExecutionStatus Execute(ActivityExecutionContext executionContext)

    {

    if (开始结点 != null)

    {

    开始结点.Closed += node_Closed;

    executionContext.ExecuteActivity(开始结点);

    return ActivityExecutionStatus.Executing;

    }

    else

    {

    return ActivityExecutionStatus.Closed;

    }

    }

     

    void node_Closed(object sender, ActivityExecutionStatusChangedEventArgs e)

    {

    ActivityExecutionContext executionContext = sender as ActivityExecutionContext;

    结点 node = e.Activity as 结点;

    node.Closed -= node_Closed;

     

     

    if (node.下一结点 == null || node.下一结点.ExecutionStatus == ActivityExecutionStatus.Closed)

    {

    executionContext.CloseActivity();

    }

    else

    {

     

    node.下一结点.Closed += node_Closed;

    executionContext.ExecuteActivity(node.下一结点);

    }

     

    }

        }

     

    宿主

    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");

    }

     

    }

     

    使用

     

     

     

     

    运行效果

     

     

     

    本系列文章表

    通过AEC解读WF的核心原理()Activity的副本

    通过AEC解读WF的核心原理()通过AEC调用添加到引擎中的服务对像

    通过AEC解读WF的核心原理()Execute方法Activity的入口

    通过AEC解读WF的核心原理()AEC在内部执行childActivity

    通过AEC解读WF的核心原理()实现一个从下向上执行的顺序容器

    通过AEC解读WF的核心原理()创建复本ForEach循环

    通过AEC解读WF的核心原理()一个实现Goto功能的Activity

    通过AEC解读WF的核心原理()实现Switch功能的Activity

    通过AEC解读WF的核心原理()一个实现Goto功能的Activity

    通过AEC解读WF的核心原理()实现IEventActivity

    通过AEC解读WF的核心原理()取消与取消处理器

    通过AEC解读WF的核心原理(十一)(题外篇) WFWindows操作系统的对比

    通过AEC解读WF的核心原理(十二)WorkflowQueue的提前提交

     

    本系列完成

    wxwinter 2008-6-18

  • 相关阅读:
    ubuntu密码正确,却不能登录图形界面
    【转】ubuntu右键在当前位置打开终端
    一些值得学习的Unity教程 (很实用的包括源码)
    Git 报错:git
    Unity3D面试——真实的面试,unity3d面试
    拖拽以及常用的鼠标事件
    白话经典算法系列之一 冒泡排序的三种实现
    c#封装三维向量,另外也看了下别人的C++封装
    c#面试3(选择题)
    Unity3D中目标相对自身的前后左右方位判断
  • 原文地址:https://www.cnblogs.com/foundation/p/1224527.html
Copyright © 2020-2023  润新知