今天我们来介绍下工作流的通信。假设有这样一个场景,有一个应用程序,当用户输入想保存一个信息的时候,系统要向用户发送一条信息确认是否保存此信息,根据用户的选择执行保存或其他操作。
我们可以利用WF内置的一些服务和活动实现此场景。
首先介绍几个概念:
1. 参数:传递参数最简单的方法就是在工作流实力创建期间传递。代码如下:


1 Dictionary<string, object> parms = new Dictionary<string, object>();
2 parms.Add("ApplicantName","无忧");
3
4 WorkflowInstance instance = workflowRuntime.CreateWorkflow(typeof(Demo1.Workflow1),parms);
因为集合是在工作流启动之前传递的,所以此方法不能用来和已经运行的工作流通信,只适合初始化工作流信息。
同样也可以将参数从工作流传递给它的宿主。代码如下:


1 workflowRuntime.WorkflowCompleted += delegate(object sender, WorkflowCompletedEventArgs e)
2 {
3 message = e.OutputParameters["ApplicantName"].ToString();
4 waitHandle.Set();
5 };
注意:工作流中必须有包含get访问修饰符的属性与添加到集合中的关键字相对应。
2. 本地通信服务
预定义一个接口,当工作流想告诉宿主某些消息的时候,它会调用接口中的某个方法,当宿主有消息要发给工作流的时候,它会触发接口中的事件,工作流会处理这个事件。
ExternalDataExchangeService:这个类用来管理所有的通信服务类。必须将这个类的实例添加到工作流的运行时中才能使用本地通信服务。代码如下:


1 using(WorkflowRuntime workflowRuntime = new WorkflowRuntime())
2 {
3 ExternalDataExchangeService dataService = new ExternalDataExchangeService();
4 workflowRuntime.AddService(dataService);
5 }
ExternalDataExchangeAttribute: 将接口标记工作流本地服务的接口。代码如下:


1 [ExternalDataExchangeAttribute]
2 public interface IEnrollmentService
3 {
4 void RequestEnrollmentStatues(string name);
5
6 event EventHandler<EnrollmentEventArgs> EnrollmentApproved;
7 event EventHandler<EnrollmentEventArgs> EnrollmentRejected;
8 }
ExternalDataEventArgs:当触发工作流活动事件的时候,随之发送的数据。代码如下:


1 [Serializable]
2 public class EnrollmentEventArgs : ExternalDataEventArgs
3 {
4
5 public EnrollmentEventArgs(Guid instanceID, string applicantName)
6 : base(instanceID)
7 {
8 this.applicantName = applicantName;
9 }
10
11 private string applicantName;
12
13 public string ApplicantName
14 {
15 get { return this.applicantName; }
16 }
17 }
注意:1.属性必须加上Serializable属性,
2.构造函数中的的instanceID是必须的,用来唯一标识一个工作流实例。
下面介绍几个WF内置的通信活动
1. CallExternalMethodActivity:可以用来在工作流运行时向外界发送工作流内部的属性。要想使用这个活动,只需要设置两个属性即可。
首先,设置InterfaceType属性。如图:
从这里可以选择程序中预定义的接口。
然后设置MethodName属性,指定调用接口的哪个方法。如图:
选择的方法不同,属性也随之发生改变,绑定好属性这个活动就可以使用了。
2. HandleExternalEventActivity: 用来处理工作流宿主触发的事件。和CallExternalMethodActivity相同,它也有InterfaceType和MethodName属性,按照上面的方法设置好属性就可以正常使用了。
本节我们介绍了有关工作流通信的几个概念和WF内置的两个活动。下一节中,我们将做个通信的简单例子。