基础工作流 4.5

Windows Workflow Foundation 4.5 中的新功能

Leon Welicki

下载代码示例

去年 9 月生成会议 (buildwindows.com),微软推出了 Windows 基础工作流 (白表 4.5) 的下一个版本和可作为 Windows 8 的开发者预览部分公众的预览 (msdn.microsoft.com/windows/apps/br229516)。在本文中,我会走通过添加到白表 4.5 中重要的新功能。给定的文章一般范围和功能集的大小,每个讨论将是短暂的但我希望你会激动下载 Windows 8 的开发者预览并开始玩白表 4.5。

白表:昨天、 今天和明天

白表 4 从开发人员社区 2010 年运到一个很大的接待。白表 4 对其前身 (WF 3.5 英寸) 包括重大进展:改进的运行时、 更好的总体性能、 简化的活动创作、 Windows 通讯基础 (WCF) 的充分集成、 声明性创作和大大简化设计器变换的主机。2011 microsoft 带来了一个功能全面的版本的状态。NET 框架 4 平台更新 1,具有相同的质量和支持可用今天保证作为任何其他组件的框架。白表 4.5,与我们的目标是解决我们了解我们的客户从当前重大问题。我们还到云 ; 采取的白表的所有电源工作 有一个巨大的生成介绍,你可以看看什么团队已达 (bit.ly/rbJROw)。

当您阅读这篇文章,我相信你会有关于白表 4 和白表 4.5 之间的兼容性问题。保证版本建立在相同的代码基和完全兼容。您所有的白表 4 投资将白表 4.5 保留,而不需要任何更改。

我们发货白表 4 后,我们收到很多伟大的反馈,我们用来计划的下一版本。白表 4.5,我们想解决您最关心的是,添加功能为建设工作流应用程序提供最佳的框架。图 1 客户显示请求和响应这些请求创建的功能。

图 1 客户请求和白表 4.5 的新功能

表按主题 ; 组织的通知 我将在即将举行的各节中使用同一主题目前最重要的功能。

创作的改进

C# 表达式白表 4,您可以使用 Visual Basic 写表达式,以及 Visual Studio 中使用时,表达式编辑器提供了您所料,如自动完成、 智能感知,如此这般的所有语言服务。但我们白表 4 的客户告诉我们他们也情愿写 C# 比 Visual Basic 中,因此我们添加对 C# 表达式的支持。现在,如果您创建 C# 项目您可以获得 C# 表达式在您的工作流程中的情况。别担心,不过。如果您创建 Visual Basic 项目,您仍然获得了 Visual Basic 表达式。C# 支持还配有你所期望的所有的语言服务中所示图 2。注意的智能感知框中显示第二个 C# 重载为字符串。格式。

C# Expressions in a Workflow图 2 C# 中工作流表达式

如果您想尝试 C# 表达式,只是创建一个 C# 工作流项目。在这篇文章的同伴代码中,也可以打开 CSharpExpressions 项目。

合同第一服务创作白表 4 带来巨大的 WCF 集成。您可以创建 WCF 服务利用所有的白表能力 (长时间运行的执行、 持久状态、 声明性创作和执行的可见性) 而无需编写一行代码 (在看到"视觉设计的工作流与 WCF 和白表 4" msdn.microsoft.com/magazine/ff646977)。创作时白表 4 中的工作流服务,服务合同是从工作流定义推断。当主机启动时,消息传递活动,在寻找的工作流定义的散步,然后公开了相应的合同 (例如,每个接收活动转换为一个服务操作)。

很多客户说他们更喜欢他们的工作流服务创建现有 WCF 服务合同 (工作流是只是其中一种可能的实现合同的),因此在白表 4.5 我们添加用于创作"合同第一"的服务支持。现在可以导入 WCF 服务合同定义工作流项目中的,并使其中一个或多个工作流服务实施该合同。工作流服务创作的这种新方法不会替换工作流第一种方法。

合同第一白表中是一个两步的过程:你在项目中添加对合同 (定期 WCF 服务合同) 的引用,然后在您的服务实现合同。

要导入合同,右键单击该项目,请选择"导入服务合同"菜单项,然后选择合同类型。一旦合同导入并生成项目时,一组代表每个操作的活动将添加到工具箱中,如中所示图 3

The Generated Activities Are Added to the Toolbox图 3 生成的活动被添加到工具箱

作为图 4 所示,您可以添加接收和 SendReply 之间的活动。这些活动表示操作的身体。

A Simple Service Method That Computes a Value图 4 简单的服务方法计算某个值的

第二步是以指示给定的服务实现合同。为此,您在设计器中打开工作流服务和 WorkflowService 根的 ImplementedContracts 集合中添加合同。

一旦实现了服务合同,设计器将运行一组新的验证规则,以确保该服务荣誉合同。因此,您将看到警告和错误,如果合同没有得到充分实施。

如果您要查看合同第一到同伴的代码中的 ContractFirst 项目在行动中,看一看。实际操作的经验请按照上一节中描述的步骤。

更有效地使用白表设计器 WF 可视设计器提供了您的工作流的图形表示,使它们更易于创建和共享。设计器是白表的一个主要功能,是最常用的创作工具。白表 4.5,我们添加了高度请求的功能,使您能够更高效的使用它。

批注中白表 4,唯一的地方,您可以添加到设计器中的文本是条的活动,而是一个活动的顶部的一行文本区域的显示名称。没有其他方法将添加到您的工作流的非结构化的描述性信息。但是,你想要能够在您传达不只是工作流定义 (例如,添加行为的进程步骤说明) 的活动设计器中添加注释或文本。

白表 4.5 我们添加注释,使您可以将文本的评论和描述添加到设计器中的活动。图 5 显示工作流与无注释。请注意如何你现在可以向任何活动添加描述性信息。带批注,设计器的打印输出可以充分表达该工作流在做什么。

A Workflow with and Without Annotations图 5 工作流与无批注

您可以显示注释作为始终可见或粘滞便笺作为活动的显示名称栏中。

注释是选择不在功能和没有执行时间的影响。他们是作为添加到工作流 XAML 文件附加属性,如下面的代码片断所示:

<Activity mc:Ignorable="sap2010" 
  x:Class="DesignerImprovements.Annotations" 
  xmlns="https://schemas.microsoft.com/netfx/2009/xaml/activities"
  xmlns:mc="https://schemas.openxmlformats.org/markup-compatibility/2006"
  xmlns:sap2010="https://schemas.microsoft.com/netfx/2010/xaml/activities/presentation"
  xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml">
  <Sequence sap2010:Annotation.AnnotationText="This is an example annotation">
    <WriteLine Text="Hello Dev11"/>
  </Sequence>
</Activity>

要查看操作中的注释,请看看附加注释项目在同伴的代码。 实践的经验,打开 WF 4.5 工作流项目、 添加到设计器中的活动和选择活动的上下文菜单中的"添加注释"。

加强流程图和状态设计师您要求我们提高方面的设计经验,让你更有成效,特别是要添加新的 activ­伊蒂埃斯流程图或状态 (可通过。净框架平台更新 1)。 我们听着。

我们添加自动连接,从而可以自动连接到一个现有的活动,在设计器中的一个新的活动。 我们添加自动插入,允许您插入两个现有的活动,通过新的活动放了连接线之间的活动。 图 6 显示了这些功能。

Auto-Connect and Auto-Insert
图 6 自动连接和自动插入

要尝试这样做,只需创建一个白表项目,并添加流程图或状态。 当添加新的活动,你会发现滴 auto-connect 的目标。 你已经连接两个活动后,您可以通过它放了连接线添加第三个。

大工作流导航中白表 4,大于屏幕工作流时,您移动使用水平和垂直滚动条。 你告诉我们,这种方式移动大型工作流是痛苦的限制了您的工作效率。

在 WF 4.5 我们添加平移,它允许通过设计器的画布上使用鼠标移动。 您可以通过单击设计器中的泛按钮启用平移模式。 平移是作为一种通用的设计器功能,可用,因此您可以使用它与任何现有的活动。

要尝试平移,打开任何工作流设计器中,单击泛按钮和享受利落 !

白表 4.5 还提供了允许您直观显示您的工作流的文档大纲的树视图。 这为您提供您的工作流程,使您能够更轻松地导航大型的工作流程非常简洁和结构化视图。 当您单击此视图中的一个活动时,它选定在工作流定义中,如中所示图 7

Document Outline View of a Workflow
图 7 文档大纲视图中的工作流

要尝试此功能,打开工作流设计器中,转到视图菜单,选择其他窗口和文档大纲。

在设计器中搜索集成白表 4 中时,可以使用 Visual Studio 搜索使用白表设计器,但搜索结果不集成在一起,白表设计器。 单击搜索结果不会把您带到工作流中的特定位置。 你清楚这将如何影响您的工作效率,并为我们提供这种能力是何等重要。

在 WF 4.5 我们与 Visual Studio 搜索集成白表设计器。 现在点击搜索结果将带你到活动在工作流中,即使它嵌套了走了几个级别。

试试这个,创建工作流项目并开始编辑工作流设计器中。 添加一些活动并配置它们的属性。 现在,搜索使用 Visual Studio 的搜索关键字。 搜索结果应以你的匹配关键字的活动。

用序列自动环绕白表 4 活动模型支持组成,在其核心 ; 可以组成的活动,不受限制。 例如,Body 属性一段时间的活动可以是一个序列、 平行、 流程图、 状态、 WriteLine、 延迟或其他任何现有的活动。 复合活动往往接受 (一组),而不是只是一个活动,可以是任何其他叶或复合活动的 Body 属性。

更常见的身体活动之一是序列,尤其是与控制流活动喜欢在 ForEach 同时,等等。 有了这些,如果您添加一个孩子,然后更改你的思想对序列的元素,有利则需要削减儿童在正文中,然后添加到主体的序列和粘贴儿童。 这是乏味而且容易出错。

白表 4.5,我们添加了一个"用序列自动包围"功能。 例如,如果你有一段时间,除去另一项活动时,其主体就是 WriteLine,其中包含现有的活动和新的序列自动创建,如中所示图 8

Auto-Surround with Sequence
用序列图 8 汽车环绕声

要尝试这样做,请按照中的步骤图 8

生成集成中白表 4 可以在设计器中以声明方式创建新的活动。 当您这样做时,实际上您定义一种新的类型,将放置在编译项目时生成的程序集。 但是,如果您生成一个白表 4 项目和 XAML 中有错误,生成仍成功虽然中生成的程序集不包括您的工作流。

白表 4.5 我们固定的这个问题。 如果您生成错误的工作流,生成将中断,如您所料。

若要实现此解决方案,我们添加扩展性到 XamlBuildTask 以便在 XAML 活动,编译过程中可以访问它中断生成,当 XAML 工作流文件有错误。

要尝试此功能,创建一个新的白表应用程序和工作流中添加错误配置的活动。 你将生成错误。 您也可以尝试在同伴的代码中的 ErrorBreaksTheBuild 项目。

状态机框出的状态是一种非常重要的控制流活动,没有用白表 4。 关于这次活动,所以现在状态的重要性的反馈带来的吨是白表 4 中可用的安装之后。NET 框架产品更新 1。 白表 4.5,您不需要安装任何更新可利用的状态 — — 它包括外框的右侧。

要尝试此功能,创建一个工作流项目和添加状态活动或只是在这篇文章的同伴代码中打开状态示例项目。

版本控制支持

白表 4 不包括对工作流的版本控制支持。 如果你想要的版本控制,您不得不写一切对你自己的常常打很难解决的问题。 白表 4.5 包括启用版本控制的新功能。

WorkflowIdentity 中白表 4 中的主机是负责定义和实例之间的关联。 一旦实例已被保留,从内存中卸载,主机必须提供的正确定义来继续的实例的执行。 一个大的挑战就是没有保持的实例状态,可以帮助确定哪些定义用于创建该实例的主机信息。 此外,如果主机配置错误定义加载一个实例时,用户会得到一个尴尬的异常,因为错误是不能匹配定义,而不是真正的版本不匹配的实例状态的副作用。

白表 4.5 引入了 WorkflowIdentity,一种新的类型,是指完全配置工作流定义并是实例的运行时状态的一部分。 WorkflowIdentity 包含一个名称 (字符串)、 一个版本 (System.Version) 和包 (字符串)。 名称和版本一目了然 ; 包是一个可选的字符串,用于消除歧义。 指的是工作流定义 (程序集名称、 服务 URI 或您选择的任何字符串) 的容器。 WorkflowIdentity 是所有白表版本控制功能的基石。

WorkflowIdentity 的最有用的特点之一是它是工作流实例状态的一部分,并住在一个活动的整个生命周期:它在持久性期间保存,可以从实例存储查询并发出与工作流实例的跟踪信息。

使用 WorkflowIdentity 是容易的。 以下代码段显示了如何使用它的 WorkflowApplication,我们单实例、 单定义、 过程中的主机 (你只需要将 WorkflowIdentity 的实例传递到构造函数的 WorkflowApplication):

WorkflowIdentity identity = new WorkflowIdentity("Sample", new Version(1, 0, 0, 0),
  "MyPackage");
WorkflowApplication application = new WorkflowApplication(new MyActivity(), identityV1);

我们只是工作流配置 WorkflowApplication­的身份,但我们还没有尚未做任何有用的东西。 下一个代码示例演示如何使用身份来检测版本不匹配,并提供一个可操作的错误消息。 版本不匹配时尝试加载一个实例,事件中,您将获得 VersionMismatchException,指出问题的原因,并包含提供的和预期的身份。 此信息可以用于日志记录或从错误中恢复:

try
{                
  WorkflowIdentity wrongIdentity = new WorkflowIdentity("Sample", new Version(2, 0, 0, 0), 
    "MyPackage");

  WorkflowApplication application = new WorkflowApplication(new WrongActivity(), 
    identityV2);

  application.Load(instanceId);
}
catch (VersionMismatchException ex)
{
  Console.WriteLine("Version Mismatch!
{0}", ex.Message); 
  Console.WriteLine("Expected: {0}; Provided: {1}", ex.ExpectedVersion, ex.ActualVersion); 

}

最后,您可以从实例存储区加载它之前了解给定的工作流实例的身份。 要查询身份,您需要获取的 WorkflowApplicationInstance,表示实例已与定义相关联的白表 4.5 中引入新的类型。 它用于检索有关该实例的元数据 — — 在此情况下,身份。 请参阅 bit.ly/ssAYDn 的详细信息。

注意 WorkflowIdentity 有效不仅与 WorkflowApplication,也与 WorkflowServiceHost。

如果您想尝试此功能,请打开的 WorkflowIdentity 项目同伴的代码中。

WorkflowServiceHost WorkflowServiceHost (WFSH) 是在白表 4 中提供的工作流出的框、 单-定义的多个实例主机。 然而,一个不幸的白表 4 限制是执行更改工作流定义结果异常如果您尝试加载以前保持的实例到 WFSH。 这是因为主机是无法运行这些实例使用新的定义 (这是我们在 WorkflowIdentity 节中指出的问题)。 一些客户工作围绕缺乏在白表 4 中使用多个 WFSHs 和路由 WCF 服务客户端应用程序和工作流之间的中介作为内置版本控制支持。 客户端发送邮件的路由器,将邮件路由到相应的 WFSH 使用正确的版本定义的配置。 缺点是这需要版本知道成功地将消息发送到服务实例的客户端应用程序。

在 WF 4.5,WFSH 已经成为多版本的主机 ; 您可以部署工作流服务相同的 WFSH 内的多个版本,它会将传入邮件传递到正确的版本。

语义是很简单的:新实例启动与最新版本的服务,并运行的实例继续执行与用来启动他们的版本。 有一些限制上什么你可以从一个版本的变化 ; 您不能删除服务操作 (获得),但您可以添加新的 (规则是类似于在 CLR 中创建派生的接口)。

此功能的关键启用码是 WorkflowIdentity。 要确定您需要配置其身份的服务定义的版本。 服务的旧版本必须放在一个"受支持的版本"的文件夹,是具有相同的名称作为工作流服务在 App_Code 文件夹中 (请参阅图 9)。 或者,旧版本还可以加载明确到 WorkflowServiceHost 通过添加到 SupportedVersions 集合之前,打开主机。

WorkflowServiceHost Side-by-Side Versioning
图 9 WorkflowServiceHost-并行版本控制

使用这个新功能,不再需要路由器,和客户端应用程序不必版本注意。 他们只是发送一条消息 ; 通常的关联机制将其解析为正确的实例和主机将使用相应的定义 (因为保持的实例状态包含定义需要加载它的身份)。 XCopy 部署语义会保留,因此您不需要写一行代码来使用它。 此功能也是自托管方案 (在您自己的应用程序中的托管 WFSH) 中可用。

要尝试此功能,请打开 WFSH_SxS 项目同伴的代码中。

动态更新白表 4,一旦开始工作流实例,在没有受支持的方法更改定义的工作流。 这往往是一个问题,当程序需要更新,由于对 bug 修复或不断变化的需求。

企业客户都强调这种能力的重要性,因为他们经常需要更改特定工作流实例在长时间运行的工作流。 例如,假设的工作流模型的面试过程,有四个面试官,但,鉴于新的公司政策,现在需要改变添加第五次的面试官。 你不能那样做白表 4。

您可以在白表 4.5。 动态更新允许您更改以适应新的工作流定义工作流的运行实例。 这种变化可能会遗漏的动机,在设计时,错误的工作流程,或者新的要求。 动态更新并不被针对需要批发的变化的情况导致显著区别其原始设计的工作流。 在那种情况下,您应该设计,而不是在运行中的实例更改新工作的流。

动态更新通常是一个两步的过程:当更改工作流定义,您还需要创建一个更新映射:结构,包含有关更改的信息。 当部署新的版本时,地图可以用于更新运行的实例的新定义。 只有当他们空闲和持久化,可以更新正在运行的实例。

动态更新,可用在 WorkflowApplication 和 WorkflowServiceHost,是高级、 复杂的功能,它具有更多的功能,比我提到过。 它支持更新活动,提供自定义更新语义,发光的跟踪信息,和更多。 它为您提供了一个丰富的 API,您可以在应用程序中使用为您运行的实例提供更新功能。

运行时的增强功能

我想简要介绍一些运行时功能增强,在白表 4.5.Due 空间的限制,我不会深入他们与其他功能 ; 相同级别的详细信息 这些都是更确定范围,先进的。

部分信任白表 4 规定执行的完全信任。 白表 4.5 可以运行在部分受信任的 AppDomains。

表达式可扩展性我们修改 ExpressionTextBox 来绑定到的对象,而不是字符串。 因此,您可以提供自己编辑经验的表达式和你不限于的文本表示形式。 我们也暴露了快速路径功能,可以与活动代码用于创作表达活动具有更好的性能。

Visual Basic 性能增强我们大大改进的 VisualBasicValue/VisualBasicReference 性能通过更改其内部的实现。

白表 3 废弃白表 3 类型已标记为过时在白表 4.5 的程序集。

接近尾声了

我们花了白表 4,基于您的反馈意见,让它更好。 我们添加了多要求的功能和固定的一些关键问题,为您提供最佳的工作流框架,为你。网络应用。

白表 4.5 是就地替换为白表 4,是与白表 4 完全兼容。 我们彻底测试白表 4.5 不打破任何白表 4 方案 ; 您所有的白表 4 投资将完全保留在白表 4.5,无需任何更改。

如果您编写的应用程序白表 4,保持这样做 ! 当您准备将移动到白表 4.5 时,只是您的代码,并且您和您的客户将能够利用并享受这篇文章中所述的所有改善措施。

Leon Welicki 是专注的白表的编程模型和运行库在 WF 团队的高级项目经理

多亏了以下技术专家,检讨这篇文章: 乔克兰西戴夫 · 克利夫丹利克哈尼族 Khoshdel Nikkhoo元朗以撒