公司购买过程

PurchaseProcess 示例演示如何使用自动最佳建议选择创建基于建议(RFP)的非常基本的购买流程。 它结合ParallelParallelForEach<T>ForEach<T>以及一个自定义活动,以创建表示流程的工作流。

此示例包含一个 ASP.NET 客户端应用程序,该应用程序允许以不同的参与者身份与进程交互(作为原始请求者或特定供应商)。

演示

  • 自定义活动。

  • 活动构成。

  • 书签。

  • 坚持。

  • 程式化的持久性。

  • 追踪。

  • 跟踪。

  • 在不同的客户端(ASP.NET Web 应用程序和 WinForms 应用程序)中托管 WF。

流程说明

此示例演示 Windows Workflow Foundation (WF) 计划的实现,以收集泛型公司供应商的建议。

  1. X 公司的员工创建提案请求(RFP)。

    1. RFP 标题和说明中的员工类型。

    2. 员工选择要邀请的供应商提交建议。

  2. 员工提交建议。

    1. 工作流的一个实例已创建。

    2. 工作流正在等待所有供应商提交其建议。

  3. 收到所有建议后,工作流将循环访问所有收到的建议,并选择最佳建议。

    1. 每个供应商都有信誉(此示例将信誉列表存储在VendorRepository.cs中)。

    2. 建议的总价值由 (供应商键入的值) * (供应商的记录信誉) / 100 决定。

  4. 原始请求者可以查看所有提交的建议。 报告中的一个特别部分提出了最佳建议。

进程定义

示例的核心逻辑使用一个 ParallelForEach<T> 活动来等待来自各个供应商的报价(该活动使用一个自定义活动来创建书签),并使用一个 InvokeMethod 活动将供应商建议注册为 RFP。

然后,该示例遍历存储在RfpRepository中的所有收到的建议,计算调整后的值(使用Assign活动和System.Activities.Expressions活动),如果调整后的值优于之前的最佳报价,则将新值指定为最佳报价(使用IfAssign活动)。

此示例中的项目

此示例包含以下项目。

项目 DESCRIPTION
常见 过程中使用的实体对象(建议请求、供应商和供应商提案)。
WfDefinition 客户端应用程序用来创建和使用购买过程工作流实例的过程(作为 WF 程序)和主机 (PurchaseProcessHost) 的定义。
WebClient ASP.NET 客户端应用程序,允许用户创建和参与购买过程的实例。 它使用自定义创建的主机与工作流引擎进行交互。
WinFormsClient 一个 Windows 窗体客户端应用程序,它允许用户创建和参与购买过程的实例。 它使用自定义创建的主机与工作流引擎进行交互。

WfDefinition

下表包含 WfDefinition 项目中最重要的文件的说明。

文件 DESCRIPTION
IPurchaseProcessHost.cs 工作流主机的接口。
PurchaseProcessHost.cs 工作流主机的实现。 主机提取工作流运行时的详细信息,并在所有客户端应用程序中用于加载、运行和与 PurchaseProcess 工作流实例交互。
PurchaseProcessWorkflow.cs 包含购买流程工作流的定义(派生自 Activity)的活动。

派生自 Activity 的活动通过组合现有自定义活动和来自 .NET Framework 4.6.1 活动库的活动来组合功能。 组装这些活动是创建自定义功能的最基本方法。
WaitForVendorProposal.cs 此自定义活动派生自 NativeActivity,创建了一个命名书签,供应商必须在稍后提交提案时恢复该书签。

NativeActivity 派生的活动,与从 CodeActivity 派生的活动一样,可通过重写 Execute 来创建命令性功能,除此之外还可以通过传递给 ActivityContext 方法的 Execute 访问工作流运行时的所有功能。 此上下文支持计划和取消子活动、设置非持久性区域(执行阻塞期间,运行时没有保存工作流的数据,如在原子事务内),以及 Bookmark 对象(用于继续已暂停工作流的句柄)。
TrackingParticipant.cs TrackingParticipant接收所有跟踪事件并将其保存到文本文件中。

跟踪参与者将作为扩展添加到工作流实例中。
XmlWorkflowInstanceStore.cs 自定义 InstanceStore 可将工作流应用程序保存到 XML 文件中。
XmlPersistenceParticipant.cs 一个自定义 PersistenceParticipant ,用于将请求请求实例保存到 XML 文件。
AsyncResult.cs/CompletedAsyncResult.cs 用于在持久性组件中实现异步模式的帮助程序类。

常见

下表包含 Common 项目中最重要的类的说明。

班级 DESCRIPTION
供应商 在“征求建议”中提交提案的供应商。
RequestForProposal 建议请求(RFP)是邀请供应商提交有关特定商品或服务的建议。
VendorProposal 供应商提交的针对具体 RFP 的建议。
VendorRepository 供应商的储存库。 此实现包含供应商实例的内存中集合,以及用于公开这些实例的方法。
RfpRepository 招标请求存储库。 此实现将使用 Linq to XML 来查询由程式化的持久性所生成的征求建议书的 XML 文件。
IOHelper 此类处理所有与 I/O 有关的问题(文件夹、路径等。)

Web 客户端

下表包含 Web 客户端项目中最重要的网页的说明。

文件 DESCRIPTION
CreateRfp.aspx 创建并提交新的提案请求。
Default.aspx 显示所有活动的和已完成的征求建议书。
GetVendorProposal.aspx 从具体的征求建议书中获取来自供应商的建议。 此页面仅供供应商使用。
ShowRfp.aspx 显示有关“建议请求”的所有信息(收到的建议、日期、值和其他信息)。 此页面仅供“征求建议”的创建者使用。

WinForms 客户端

下表包含 Win Forms 项目中最重要的表单的说明。

表格 DESCRIPTION
NewRfp 创建并提交新的提案请求。
ShowProposals 显示所有活动的和已完成的征求建议书。 注意: 创建或修改“建议请求”后,可能需要单击 UI 中的 “刷新 ”按钮以查看该屏幕中的更改。
提交建议书 在具体的提案请求中,从供应商那里获取建议。 此窗口仅供供应商使用。
ViewRfp 显示有关“建议请求”的所有信息(收到的建议、日期、值和其他信息)。 此窗口仅由“征求建议”的创建者使用。

持久性文件

下表显示了持久性提供程序 (XmlPersistenceProvider) 生成的文件位于当前系统的临时文件夹的路径(使用 GetTempPath)。 跟踪文件是在当前执行路径中创建的。

文件名 DESCRIPTION 路径
rfps.xml 具有所有活动的和已完成的征求建议书的 XML 文件。 GetTempPath
[instanceid] 此文件包含有关工作流实例的所有信息。

此文件由架构化持久性实现(XmlPersistenceProvider 中的 PersistenceParticipant)生成。
GetTempPath
[instanceId].tracking 包含具体实例中发生的所有事件的文本文件。

此文件由 TrackingParticipant 生成。
GetTempPath
PurchaseProcess.Tracing.TraceLog.txt 工作流根据 App.config 或 Web.config 文件中的配置参数生成的跟踪文件。 当前执行路径

使用此示例

  1. 使用 Visual Studio 打开PurchaseProcess.sln解决方案文件。

  2. 若要执行 Web 客户端项目,请打开 解决方案资源管理器 并右键单击 Web 客户端 项目。 选择“ 设置为启动项目”。

  3. 若要执行 WinForms 客户端项目,请打开 解决方案资源管理器 ,然后右键单击 WinForms 客户端 项目。 选择“ 设置为启动项目”。

  4. 要生成解决方案,按 Ctrl+Shift+B。

  5. 若要运行解决方案,请按 Ctrl+F5。

Web 客户端选项

  • 创建新的 RFP:创建新的提案请求(RFP),并启动购买流程工作流。

  • 刷新:刷新主窗口中的活动和已完成 RFP 列表。

  • 视图:显示现有 RFP 的内容。 供应商可以提交其建议(如果受邀或 RFP 未完成)。

  • 查看者身份:用户可通过在活动的 RFP 网格的“查看者身份”组合框中选择所需的参与者,使用不同的标识访问 RFP

WinForms 客户端选项

  • 创建 RFP:创建新的建议请求(RFP),并启动购买流程工作流。

  • 刷新:刷新主窗口中的活动和已完成 RFP 列表。

  • 查看 RFP:显示现有 RFP 的内容。 供应商可以提交其建议(如果受邀或 RFP 未完成)

  • 连接者身份:用户可通过在活动的 RFP 网格的查看者身份组合框中选择所需的参与者,使用不同的标识访问 RFP。