学习完本章,你将掌握:
1.了解对于创建一个功能齐全的自定义工作流活动来说哪些组件是必须的
2.创建基本的自定义工作流活动
3.在基本的自定义工作流活动中应用验证规则
4.把基本的自定义工作流活动集成到Microsoft Visual Studio的工作流视图设计器和工具箱中
WF并不可能涵盖到你可能在你的工作流中想要实现的各个方方面面。即使WF对于开发社区来说仍是非常新的技术,但目前已经可以获得许多免费发布的自定义活动,可以肯定商业级的活动最终也会跟进。
在这章中,你将通过创建一个新的工作流活动来了解WF的个中奥妙,这个活动从远程FTP服务器中检索文件。你将看到在创建你自己的活动时哪些东西是必需的,以及其中哪些部分挺不错。你也将更深入地了解活动是怎样和工作流运行时交互的。
备注:只在一章中对自定义活动开发的每一个细节进行探讨是不可能,这儿简化了太多的细节。不过好消息是,对于得到一个完整功能的活动来说是容易的,这不用知道每一个细节。
关于活动的更多知识
在第四章(活动及工作流类型介绍)中,我们初步了解了一下活动并讨论了像ActivityExecutionContext之类一些话题,ActivityExecutionContext用来容纳一些和正执行的活动相关的一些信息,工作流运行时需要不时对这些信息进行访问。我们这里将对WF活动进行更深入一些的了解。
活动的虚拟方法
在创建自定义活动时首先需要了解的是基类为你提供了哪些虚拟的方法和属性。表13-1显示了活动中被普遍使用的可重写的一些方法。(这里没有虚拟属性。)
表13-1Activity中被普遍使用的可重写的虚拟方法
方法 | 功能 |
Cancel | 在工作流被取消时被调用。 |
Compensate | 这个方法实际上并不来自于Activity基类,它实际上需要由ICompensatableActivity接口提供,许多活动都从该接口派生。因此,不管出于什么目的和意图,都把它当作Activity的方法。你将实现这个方法以便对失败的事务进行补偿。 |
Execute | 被用来执行活动要去完成的对应的工作。 |
HandleFault | 在活动内部代码抛出一个未经处理的异常时被调用。注意一旦该方法被调用将没有办法重启该活动。 |
Initialize | 在活动被初始化时被调用。 |
OnActivityExecutionContextLoad | 在活动完成了它的工作流程后被调用。当前执行上下文(current execution context)正在转移到另一个活动。 |
Uninitialize | 在活动要被反初始化时被调用。 |
在你的活动已经被加载到工作流运行时中但在执行之前的时候,假如你需要进行一些特定的处理工作,一个极好的位置是在Initializze方法中做这些事情。你或许也会在Uninitialize方法中执行一些相似的处理工作之外的事情。
OnActivityExecutionContextLoad和OnActivityExecutionContextUnload方法分别表示活动正加载到工作流运行时中和活动正从工作流运行时中移走。在OnActivityExecutionContextLoad被调用之前以及OnActivityExecutionContextUnload被调用之后,从WF的角度来看,该活动是处于卸载状态中。它或许是被序列化到一个队列中、保存进一个数据库中或者甚至是在磁盘上等待被加载。但在这些方法(OnActivityExecutionContextLoad和OnActivityExecutionContextUnload方法)被调用之前或之后它并不存在于工作流运行时之中。
Cancel、HandleFault和Compensate都在显而易见的条件(指取消、失败和补偿条件)激发的时候被调用。尽管Compensate真正用在执行你的事务补偿的地方(看看第15章:工作流和事务),但它们主要的用途都是去执行一些你想去执行的额外的工作(例如日志)。牢记这些方法被调用的时候都太晚了,因为到你的活动被要求对失败进行补偿的时候,你不能对事务进行恢复;你也不能撤销一个未经处理的异常或者终止一个取消(cancle)的请求。所有你能做的是去执行一些清理或者其它处理的请求,就Compensate来说,实际上是为失败的事务提供补偿功能。
Execute是最有可能被重写的Activity的虚拟方法,这只不过是因为这个方法需要你重写以去执行活动应当要去执行的工作。
活动组件
尽管毫无疑问你需要亲自去写自定义活动代码,完整开发的WF活动都带有一些额外的支持和工作流无关的行为的代码,但通常在工作流可视化设计器中都为开发者提供了更丰富的开发体验。例如,你可能想要提供一个验证器对象以便对不适当的活动配置进行检查并返回错误信息;或者你可能需要提供一个ToolboxItem或者ToolboxBitmap以便更好地和Visual Studio工具箱集成。不管你是否相信,通过使用一个专门的设计器类来修改活动的主题,你实际上能够调整你的活动放到工作流视图设计器中的呈现样式。在本章中的示例实现了所有这些东西以对它们的功能和效果进行演示。