通过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

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

 

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

http://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

posted on 2008-06-18 11:56 WXWinter(冬) 阅读(1945) 评论(10)  编辑 收藏

评论

#1楼  2008-06-18 12:21 生鱼片      

这个好酷,我要抓紧学习了。   回复  引用  查看    

#2楼  2008-06-18 12:33 刘皇叔      

读不明白。。呵呵
有空好好研究下。。   回复  引用  查看    

#3楼  2008-06-18 13:02 Windie Chai(笑煞天)      

太酷了!!!   回复  引用  查看    

#4楼  2008-06-18 23:11 曲滨*銘龘鶽      

看来我越来越聪明了一看就懂;

利用【博主】的列子可以自己自定义一些给客户用的设计器了;

描述了一些自定义设计器,容器,节点的最基础的代码

这个例子主要是启发性的,不是可用解决方案,对于明白点的人是比较有启发意义的

wxwinterDesigner 类,是控制设计器行为的
这里处理两个节点间的关系的拖拽;这个类是设计时的在这个工程设置断点是不会有任何结果的,需要在开个工程挂在VS上就和调试控件设计时一样,不过调试选项略有区别;

如果仔细观看了【博主】其他文章,在多加练习、做出第一个图中那个东西是不成问题的。   回复  引用  查看    

#5楼 [楼主] 2008-06-19 13:36 WXWinter(冬)      

@生鱼片
@刘皇叔
@Windie Chai(笑煞天)
(^_^)   回复  引用  查看    

#6楼 [楼主] 2008-06-19 13:48 WXWinter(冬)      

@曲滨*銘龘鶽

我的13篇文章,没白写,至少兄弟你已经知道我在写的是什么了

得多人都说VS简单,拖拖控件就出来了,没有其它语言有技术含量,但那些拖就出来了的控件不是天生的,是一行行代码写出来的,而且为了让使用者用的方便,控件样式实现的工作量有时已经超过控件的业务   回复  引用  查看    

#7楼  2008-06-21 02:25 曲滨*銘龘鶽      

@WXWinter(冬)
说 VS 简单的,用记事本去!就应该这样对待他们;

开发语言到现在已经和一点dos、win95 年代有了很大的区别
现在的新兴开发语言的特点都是,入门简单学深了难,因为他们几乎包含以前历代开发语言的特性和功能,范围,深度都很大,类库和分枝技术众多;

就像一棵大树一样,你很容易看清主干,但你很难看清到底有多少枝叶。
如果要把这个大树整个拿走是不可能的、甚至连一个比较粗的枝干都是很难拿走的、你必须顺着主干爬上去,摘一些你感兴趣的枝页,技术体力好点的可以多摘走一些,否则只能少摘点,甚至有一些人只能在地上拾一些树叶,这就是道啊......

其实我光看第13章 ,就已经理解前12章了、呵呵借你宝地 吹吹牛大家开心开心、 ^_^   回复  引用  查看    

#8楼  2008-06-26 10:14 Eric Huang Tw [未注册用户]

感謝您的分享
能利用修改Designer達成此風格
真是太強了   回复  引用    

#9楼  2008-06-26 12:19 凭海临风 [未注册用户]

http://msdn.microsoft.com/zh-cn/magazine/cc163504.aspx(构建自定义活动以扩展您的工作流的作用范围)文中还提到Don Box 和 Dharma Shukla 撰写的文章《使用 Windows Workflow Foundation 的声明性模型简化开发》,跟大家分享:)
设计时的东东研究一下还是很有意思的。   回复  引用    

#10楼  2008-07-04 15:31 VortexDragon(旋风龙)      

学习一下。不错。   回复  引用  查看    


标题  
姓名  
主页
Email (只有博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      


相关链接:
 

导航

与我联系

搜索

 

留言簿(94)

文章分类(63)