在工作流中使用关联

Windows Workflow Foundation 运行时引擎使用关联将入站消息映射到某个工作流实例中的特定 HandleExternalEventActivity 活动。 对实例的映射是在将工作流实例 InstanceId 传递到 ExternalDataEventArgs 构造函数时完成的。

通过使用接口属性来定义关联。 Windows Workflow Foundation 工作流通信服务接口可以为关联指定附加的元数据。 关联某个工作流实例的事件活动时需要此关联数据。 关联元数据规范采用接口属性的形式,即 CorrelationParameterAttribute 属性。

备注

为通信接口提供关联属性是可选的。 默认情况下,通信接口都是无关联的。 用户只有在需要使用关联将消息传递给特定活动实例时才应添加关联属性。

接口属性

下表描述在可供 Windows Workflow Foundation 工作流通信服务使用的接口定义中可以使用的接口属性全集。

属性 说明

CorrelationParameterAttribute

用于指定在接口中定义的方法和事件的用于关联的参数名称。 如果方法或事件包含一个与该名称匹配的形参,则该参数定义该方法或事件上的相关值。 如果方法或事件没有此类参数,则方法或事件可以使用 CorrelationAliasAttribute 来定义相关值的位置。 此属性在一个接口中可以出现多次。

CorrelationInitializerAttribute

用于在方法或事件中指示相关参数的值是在调用该方法或引发该事件时初始化的。 对于给定的 CorrelationToken,必须在对话中的任何其他方法或事件执行之前调用或接收初始值设定项方法或事件。 任何可以初始化新对话(即新的相关令牌)的方法或事件都必须使用此属性进行标记。 对于每个相关令牌,方法或事件必须包含一个适当的命名参数或一个 CorrelationAliasAttribute

CorrelationAliasAttribute

在方法或事件定义中用来重写该成员的 CorrelationParameter 设置。 CorrelationAliasAttribute 属性指定可用参数中可以获得相关值的位置。 该字符串参数是针对形参集的以点分隔的路径。 该参数指示在何处可以找到匹配数据值。 如果定义了多个相关令牌,还必须指定令牌 Name 命名参数。

使用相关属性

CorrelationParameterAttribute 命名对话标识符和关联。 然后,使用该名称的形参对接口上的每个方法或事件进行声明(例如 id),如下面的 ITaskService 接口代码示例所示。 也可以使用其他属性来说明更复杂的相关映射。 当实例和相关信息已为某个对话所了解时,该类将引发其本地服务事件。 它在调用上的参数数据中指定关联。

下面的代码演示与接口定义相关的工作流通信服务 ITaskService

    [Serializable]
    public class TaskEventArgs : ExternalDataEventArgs
    {
        private string id;

        public TaskEventArgs(Guid instanceId,string id)
            :base(instanceId)
        {
            this.id = id;
        }

        public string Id
        {
            get { return id; }
            set { id = value; }
        }
    }

    [ExternalDataExchange]
    [CorrelationParameter("taskId")]
    public interface ITaskService
    {
        [CorrelationInitializer]
        void CreateTask(string taskId, string assignee, string text);

        [CorrelationAlias("taskId", "e.Id")]
        event EventHandler<TaskEventArgs> TaskCompleted;
    }

任何启动新对话的操作、方法或事件必须具有 CorrelationInitializerAttribute 属性。 如果发生对 CorrelationInitializerAttribute 方法 m 的调用,则服务类能了解该调用正在初始化新对话。 工作流对话生存期由相关引用的生存期指示。 工作流可以在对话之间卸载或加载。

下面的代码示例演示实现 ITaskService 的服务类。

    public class TaskService : ITaskService
    {
        public void CreateTask(string taskId, string assignee, string text)
        {
            Console.WriteLine("task " + taskId + " created for " + assignee);
        }

        public void RaiseEvent(TaskEventArgs args)
        {
            if (TaskCompleted != null)
                TaskCompleted(null, args);
        }

        public event EventHandler<TaskEventArgs> TaskCompleted;
    }

请参见

参考

CorrelationParameterAttribute
CorrelationInitializerAttribute
CorrelationParameterAttribute
ExternalDataEventArgs
HandleExternalEventActivity

概念

在工作流中使用本地服务
本地通信和关联概述
工作流和应用程序通信

Footer image

版权所有 (C) 2007 Microsoft Corporation。保留所有权利。