代码改变世界

《WF编程》系列之19 - 触发事件与调用方法:服务以及工作流的实现

2007-07-16 14:27  Windie Chai  阅读(...)  评论(...编辑  收藏

3.2.3.2服务的实现

本例中的服务只需要提供IBugFlowService接口的实现即可.它将作为宿主和bug跟踪工作流之间的桥梁.

public class BugFlowService : IBugFlowService

{

public void AssignBug(Bug bug)

{

Console.WriteLine(
"Assign '{0}' to a developer", bug.Title);

}

public void CreateBug(Guid instanceID, Bug bug)

{

BugAddedArgs args 
= new BugAddedArgs(instanceID, bug);

EventHandler<BugAddedArgs> ev 
= this.BugAdded;

if (ev != null

ev(
null, args);

}

public event EventHandler<BugAddedArgs> BugAdded;

}

本例中,AssignBug方法只是简单的在控制台中输出一条消息.CreateBug方法创建了BugAddArgs对象并且触发BugAdded事件.WaitForIdle属性设置为true是为了确保工作流处于可以接受事件的状态.

现在我们已经实现了消息服务,我们可以创建工作流来和服务交互了.

3.2.3.3工作流的实现

我们将用到两个关键的活动:HandleExternalEventActivity和CallExternalMethodActivity.在下面的截图中,我们添加了这两个活动来与宿主应用程序通信.


第一个活动是名为NewBug的HandleExternalEvent.我们需要它来监听BugAdded事件,在它的属性面板中,设置InterfaceType属性为IBugFlowService(包含名称空间的完整类型名称是Chapter3. IBugFlowService).然后,指定EventName属性为BugAdded.参数(Parameters)节允许我们绑定传入的BugAddedArgs参数到工作流类的一个域中.事件处理方法使用了经典的sender和e参数来代表传入的事件参数.点击相应的省略号按钮会显示对话框来绑定(或创建并绑定)参数到公开域或属性(本例中我们创建一个名为_newBug的域).


下一个活动是CallExternalMethod.同样,我们将其InterfaceType设置为IBugFlowService接口,MethodName设置为AssignBug方法.AssignBug方法需要一个参数,所以我们点击bug参数右边的省略号按钮,创建一个新的域叫做_bugToAssign.

接着为MethodInvoking事件生成事件处理方法.方法是在CallExternalMethod活动上点击右键,选择”生成处理程序(Generate Handlers)”,设计器将创建一个事件处理方法并且在调用任何外部方法前执行这个方法,我们可以在这个方法内准备需要交换的数据.


下面的代码是工作流的全部代码,包含MethodInvoking事件处理方法.在这个方法内,我们从_newBug域复制Bug的引用到_bugToAssign域.

namespace Chapter3

{

public partial class BugFlow : SequentialWorkflowActivity

{

public chapter3.BugAddedArgs _newBug;

public chapter3.Bug _bugToAssign;

private void CallAssignBug_MethodInvoking(object sender, EventArgs e)

{

_bugToAssign 
= _newBug.NewBug;

}

}

}

其实也可以直接将CallExternalMethodActivity的bug参数绑定到NewBug的_newBug属性,而不用创建第二个域(_bugToAssign)并使用MethodInvoking事件处理方法,因为_newBug即是HandleExternalEventActivity传入的数据..