《WF编程》系列之19 – 触发事件与调用方法:服务以及工作流的实现
3.2.3.2服务的实现
本例中的服务只需要提供IBugFlowService接口的实现即可.它将作为宿主和bug跟踪工作流之间的桥梁.
{
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 ev = this.BugAdded;
if (ev != null)
ev(null, args);
}
public event EventHandler 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域.
{
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传入的数据.





ExternalDataEventArgs 的类如何实现?
提示错误: Error : The event BugAdded has to be of type EventHandler where T derives from ExternalDataEventArgs
我确定 BugAddedArgs 继承 ExternalDataEventArgs : EventArgs
ExternalDataEventArgs 原来是System.Workflow.Activities 命名空间的一个类
给handleExternalEventActivity1设置接口和事件方法的时候设置不上去啊。在弹出的设置面板中输入接口的全类���没有反应
有问题。 Error : The event BugAdded has to be of type EventHandler where T derives from ExternalDataEventArgs
这里的代码有些问题的。
应该是如下:
[ExternalDataExchange]
public interface IBugFlowService
{
event EventHandler<BugAddedArgs> BugAdded;
void AssignBug(Bug bug);
}
public class BugFlowService : IBugFlowService
{
public event EventHandler<BugAddedArgs> BugAdded;
public void AssignBug(Bug bug)
{
Console.WriteLine("Assign a bug {0} to developer", bug.Title);
}
public void CreateBug(Guid instanceID, Bug bug)
{
BugAddedArgs arg = new BugAddedArgs(instanceID, bug);
EventHandler ev = this.BugAdded;
if (ev != null)
{
ev(null, arg);
}
}
}
漏了一处
public class BugFlowService : IBugFlowService
{
public event EventHandler<BugAddedArgs> BugAdded;
public void AssignBug(Bug bug)
{
Console.WriteLine("Assign a bug {0} to developer", bug.Title);
}
public void CreateBug(Guid instanceID, Bug bug)
{
BugAddedArgs arg = new BugAddedArgs(instanceID, bug);
EventHandler<BugAddedArgs> ev = this.BugAdded;
if (ev != null)
{
ev(null, arg);
}
}
}
@Dominic
Thanks,已修正,看了看项目里自己写的代码就是这样的,Word文档也是这样的,不知道COPY的时候出了什么状况。
���前也有一篇出现了丢失的问题,莫非是早先博客园的code功能会丢失?反正现在没问题.
小弟我刚接触WF,在编译的时候报了错,希望那位仁兄帮我搞定,小弟我将万分感谢!!!!!!!!!!!!!!!!!!!!!!!!!!
WRN: Assembly binding logging is turned OFF.
To enable assembly bind failure logging, set the registry value [HKLM\Software\Microsoft\Fusion!EnableLog] (DWORD) to 1.
Note: There is some performance penalty associated with assembly bind failure logging.
To turn this feature off, remove the registry value [HKLM\Software\Microsoft\Fusion!EnableLog].
[...] 关于WF本地通信服务的机制和开发方法,请参见我翻译的《WF编程 – 触发事件与调用方法》(1、2、3)。 [...]
[...] 《WF编程》系列之19 – 触发事件与调用方法:服务以及工作流的实现 [...]