PurchaseProcess 示例演示如何使用自动最佳建议选择创建基于建议(RFP)的非常基本的购买流程。 它结合Parallel、ParallelForEach<T>和ForEach<T>以及一个自定义活动,以创建表示流程的工作流。
此示例包含一个 ASP.NET 客户端应用程序,该应用程序允许以不同的参与者身份与进程交互(作为原始请求者或特定供应商)。
演示
自定义活动。
活动构成。
书签。
坚持。
程式化的持久性。
追踪。
跟踪。
在不同的客户端(ASP.NET Web 应用程序和 WinForms 应用程序)中托管 WF。
流程说明
此示例演示 Windows Workflow Foundation (WF) 计划的实现,以收集泛型公司供应商的建议。
X 公司的员工创建提案请求(RFP)。
RFP 标题和说明中的员工类型。
员工选择要邀请的供应商提交建议。
员工提交建议。
工作流的一个实例已创建。
工作流正在等待所有供应商提交其建议。
收到所有建议后,工作流将循环访问所有收到的建议,并选择最佳建议。
每个供应商都有信誉(此示例将信誉列表存储在VendorRepository.cs中)。
建议的总价值由 (供应商键入的值) * (供应商的记录信誉) / 100 决定。
原始请求者可以查看所有提交的建议。 报告中的一个特别部分提出了最佳建议。
进程定义
示例的核心逻辑使用一个 ParallelForEach<T> 活动来等待来自各个供应商的报价(该活动使用一个自定义活动来创建书签),并使用一个 InvokeMethod 活动将供应商建议注册为 RFP。
然后,该示例遍历存储在RfpRepository中的所有收到的建议,计算调整后的值(使用Assign活动和System.Activities.Expressions活动),如果调整后的值优于之前的最佳报价,则将新值指定为最佳报价(使用If和Assign活动)。
此示例中的项目
此示例包含以下项目。
| 项目 | 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 文件中的配置参数生成的跟踪文件。 | 当前执行路径 |
使用此示例
使用 Visual Studio 打开PurchaseProcess.sln解决方案文件。
若要执行 Web 客户端项目,请打开 解决方案资源管理器 并右键单击 Web 客户端 项目。 选择“ 设置为启动项目”。
若要执行 WinForms 客户端项目,请打开 解决方案资源管理器 ,然后右键单击 WinForms 客户端 项目。 选择“ 设置为启动项目”。
要生成解决方案,按 Ctrl+Shift+B。
若要运行解决方案,请按 Ctrl+F5。
Web 客户端选项
创建新的 RFP:创建新的提案请求(RFP),并启动购买流程工作流。
刷新:刷新主窗口中的活动和已完成 RFP 列表。
视图:显示现有 RFP 的内容。 供应商可以提交其建议(如果受邀或 RFP 未完成)。
查看者身份:用户可通过在活动的 RFP 网格的“查看者身份”组合框中选择所需的参与者,使用不同的标识访问 RFP。
WinForms 客户端选项
创建 RFP:创建新的建议请求(RFP),并启动购买流程工作流。
刷新:刷新主窗口中的活动和已完成 RFP 列表。
查看 RFP:显示现有 RFP 的内容。 供应商可以提交其建议(如果受邀或 RFP 未完成)
连接者身份:用户可通过在活动的 RFP 网格的查看者身份组合框中选择所需的参与者,使用不同的标识访问 RFP。