WF随笔系列之三 --- CallExternalMethod Activity 专题
3.2.1 CallExternalMethod Activity
CallExternalMethod Activity在本地通信服务中是一个重要的组件.
使用此Activity,你必须设置两个属性:
- InterfaceType: 指定接口用于定义workflow通信的。
- MethodName: 指定需要调用的方法
引文:
为什么 CallExternalMethod 仅限于调用已知接口的方法?
原因在于活动不仅仅是代码执行者,而是旨在与 HandleExternalEvent 活动一起实施与本地服务的双向交流。借助 CallExternalMethod 活动,通过将 HandleExternalEvent 活动加入工作流,您可以调用服务方法,处理服务引发的事件。
举例:
1.建立Sequential Workflow 项目
-----拖拽CallExternalMethodActivity放入Workflow
2.建立interface File
3.设置InterfaceType,MethodName属性
----设置InterfaceType为InterfaceCode
----设置MethodName为interfaceMethod
----打印预定的语句"invoke interfaceMethod"
*看下图,这里要注意此句:[Showing interfaces marked with an ExternalDataExchangeAttribute]
如果在Interface中不加[ExternalDataExchange],是不会出现可选择的Interface的.
那为什么要添加[ExternalDataExchange]?
因为对于服务接口是必要的声明,否则不能把服务增加到流程中。
{
Console.WriteLine("执行 CallExternalMethod Activity");
}
Main代码如下:
{
using (WorkflowRuntime workflowRuntime = new WorkflowRuntime())
{
ExternalDataExchangeService dataService = new ExternalDataExchangeService();
workflowRuntime.AddService(dataService);
dataService.AddService(new Serivces());
workflowRuntime.StartRuntime();
AutoResetEvent waitHandle = new AutoResetEvent(false);
workflowRuntime.WorkflowCompleted += delegate(object sender, WorkflowCompletedEventArgs e) { waitHandle.Set(); };
WorkflowInstance instance = workflowRuntime.CreateWorkflow(typeof(DemoCallExternalMethodActivity));
instance.Start();
waitHandle.WaitOne();
workflowRuntime.StopRuntime();
}
}
public class Serivces : InterfaceCode
{
InterfaceCode Members
}
另外有人问我:为什么经常会把CallExternalMethodActivity,HandleExternalEventactivity结合在一起运用呢?
用常语答:CallExternalMethodActivity属于执行行为
HandleExternalEventactivity属于事件行为
所以,执行行为一般都是会触发事件行为的。[属于流程思路的解释]
最后附 CallExternalMethodActivity应用