HiringProcess 示例演示如何使用消息传递活动和作为工作流服务托管的两个工作流实现业务流程。 这些工作流是名为 Contoso, Inc 的虚构公司的 IT 基础结构的一部分。
工作流HiringRequest
(以Flowchart的形式实现)要求组织中多位经理进行授权。 为了实现此目标,工作流使用组织中的其他现有服务(在本例中,收件箱服务和作为普通 Windows Communication Foundation (WCF) 服务实现的组织数据服务)。
ResumeRequest
工作流(实现为 Sequence)在 Contoso 的外部工作机会网站中发布一份招聘启事并管理收到的简历。 职位发布在外部网站上,有效期为固定时间段(直到超时到期)或者直到 Contoso 的员工决定将其删除。
此示例演示了 .NET Framework 4.6.1 的以下功能:
工作流服务。
消息传送活动。
基于内容的相关性。
自定义活动(声明性和基于代码)。
系统提供的 SQL Server 持久性。
自定义的 PersistenceParticipant。
自定义跟踪。
Windows 事件跟踪 (ETW) 跟踪。
活动构成。
Parallel 活动。
持久性计时器(Delay 活动)。
事务。
同一解决方案中的多个工作流。
流程说明
Contoso, Inc. 希望密切控制其各部门的负责人。 因此,每当任何员工想要启动新的招聘流程时,他们需要经过招聘请求流程审批,然后才能真正进行招聘。 此过程称为招聘流程请求(在 HiringRequestService 项目中定义),由以下步骤组成:
员工(请求者)启动招聘流程请求。
请求者的经理必须批准请求:
经理可以拒绝请求。
经理可以向请求者返回请求以获取其他信息:
- 请求者会评审请求并将请求发送回经理。
经理可以批准。
请求者经理批准后,部门所有者必须批准该请求:
部门所有者可以拒绝。
部门所有者可以批准。
部门所有者批准后,该过程需要 2 名人力资源经理或 CEO 的批准:
该过程可以转换为已接受或拒绝的状态。
如果进程已被接受,则会启动一个新的工作流实例
ResumeRequest
,(ResumeRequest
通过服务引用被链接到HiringRequest.csproj)。
一旦经理批准招聘新员工,HR 必须找到合适的候选人。 此过程由第二个工作流执行(ResumeRequest
在 ResumeRequestService.csproj 中定义)。 此工作流定义向 Contoso 的外部职业网站提交具有职业机会的职位发布、接收申请人简历以及监视职位发布状态的过程。 职位可在固定时间段内使用(直到时间过期)或直到 Contoso 的员工决定将其删除。 工作流 ResumeRequest
由以下步骤组成:
Contoso 的某员工键入有关职位和超时持续时间的信息。 员工键入此信息后,该职位将发布到职业网站。
发布信息后,相关方可以提交其简历。 提交简历后,它将存储在与职位空缺相关联的记录中。
在超时到期之前,或 Contoso HR 部门的某员工通过停止流程明确决定删除此招聘信息之前,申请者均可提交简历。
示例中的项目
下表显示了示例解决方案中的项目。
项目 | DESCRIPTION |
---|---|
ContosoHR | 包含数据协定、业务对象和存储库类。 |
HiringRequestService | 包含招聘请求流程工作流的定义。 此项目作为自承载工作流(xaml 文件)作为服务的控制台应用程序实现。 |
ResumeRequestService | 收集申请者的简历(直到超时到期或有人决定必须停止此流程为止)的工作流服务。 此项目作为声明性工作流服务(xamlx)实现。 |
OrgService | 公开组织信息(员工、职位、PositionType 和部门)的服务。 可以将此服务视为企业资源计划(ERP)的公司组织模块。 此项目作为公开 Windows Communication Foundation (WCF) 服务的控制台应用程序实现。 |
InboxService | 包含员工可执行任务的收件箱。 此项目作为公开 WCF 服务的控制台应用程序实现。 |
InternalClient | 用于与进程交互的 Web 应用程序。 用户可以启动、参与和查看其 HiringProcess 工作流。 使用此应用程序,他们还可以启动和监视 ResumeRequest 进程。 此网站实现为 Contoso 的 Intranet 内部网站。 此项目作为 ASP.NET 网站实现。 |
CareersWebSite | 公开 Contoso 的空缺职位的外部网站。 任何可能的候选者都可以导航到此网站并提交简历。 |
功能摘要
下表介绍了此示例中如何使用每个功能。
功能 / 特点 | DESCRIPTION | 项目 |
---|---|---|
流程图 | 业务流程表示为流程图。 此流程图说明以与企业在白板上绘制流程的方式相同。 | HiringRequestService |
工作流服务 | 具有进程定义的流程图托管在服务中(在此示例中,服务托管在控制台应用程序中)。 | HiringRequestService |
消息传递活动 | 流程图以两种方式使用消息传递活动: - 从用户获取信息(接收每个审批步骤中的决策和相关信息)。 - 与其他现有服务交互(InboxService 和 OrgDataService,通过服务引用来使用)。 |
HiringRequestService |
基于内容的相关性 | 审批消息与招聘请求的 ID 属性相关联: - 启动流程时,使用请求 ID 初始化相关性句柄。 - 传入的审批消息与其 ID 相关联(每个审批消息的第一个参数是请求的 ID)。 |
HiringRequestService / ResumeRequestService |
自定义活动(基于声明性和基于代码) | 此示例中有多个自定义活动: - SaveActionTracking :此活动发出一个自定义的 TrackingRecord(使用 Track)。 此活动是使用命令性代码扩展 NativeActivity编写的。- GetEmployeesByPositionTypes :此活动接收位置类型 ID 的列表,并返回 Contoso 中具有该位置的人员的列表。 此活动已通过声明式方式创建(使用活动设计工具)。- SaveHiringRequestInfo :此活动保存 HiringRequest 的信息(使用 HiringRequestRepository.Save )。 此活动是使用命令性代码扩展 CodeActivity编写的。 |
HiringRequestService |
系统提供的 SQL Server 持久性 | 将承载流程图过程定义的 WorkflowServiceHost 实例配置为使用系统提供的 SQL Server 持久性。 | HiringRequestService / ResumeRequestService |
自定义跟踪 | 该示例包含一个自定义跟踪参与者,用于保存HiringRequestProcess 的历史记录(记录哪个操作已完成、由谁完成以及完成时间)。 源代码位于 HiringRequestService 的 Tracking 文件夹中。 |
HiringRequestService |
ETW 跟踪 | 在 HiringRequestService 服务的 App.config 文件中配置系统提供的 ETW 跟踪。 | HiringRequestService |
活动组合 | 流程定义使用Activity的自由组合。 流程图包含多个顺序活动和并行活动,这些活动中同时又包含其他活动(依此类推)。 | HiringRequestService |
并行活动 |
-
ParallelForEach<T> 用于以并行方式在 CEO 和 HR 经理的收件箱中注册(等待两名 HR 经理的审批步骤)。 - Parallel 用于在“已完成”和“已拒绝”步骤中执行一些清理任务 |
HiringRequestService |
模型取消 | 此流程图使用 CancellationScope 创建取消行为(在此情况下它执行一些清理操作)。 | HiringRequestService |
客户持久性参与者 |
HiringRequestPersistenceParticipant 将数据从工作流变量保存到 Contoso HR 数据库中存储的表。 |
HiringRequestService |
工作流服务 |
ResumeRequestService 是使用工作流服务实现的。 工作流定义和服务信息包含在 ResumeRequestService.xamlx 中。 该服务配置为使用持久性和跟踪。 |
ResumeRequestService |
持久计时器 |
ResumeRequestService 使用持久计时器来定义作业发布的持续时间(一旦超时过期,作业发布将关闭)。 |
ResumeRequestService |
交易 | TransactionScope 用于确保在执行多个活动(收到新简历时)中的数据保持一致性。 | ResumeRequestService |
交易 | 自定义持久性参与者(HiringRequestPersistenceParticipant )和自定义跟踪参与者(HistoryFileTrackingParticipant )使用相同的事务。 |
HiringRequestService |
在 ASP.NET 应用程序中使用 WF。 | 从两个 ASP.NET 应用程序访问工作流。 | InternalClient / CareersWebSite |
数据存储
数据存储在名为 ContosoHR
的 SQL Server 数据库中(用于创建此数据库的脚本位于 DbSetup
文件夹中)。 工作流实例存储在名为 <
这两个数据库都是通过从 Visual Studio 开发人员命令提示符运行Setup.cmd脚本创建的。
运行示例
创建数据库
打开 Visual Studio 的开发人员命令提示符。
导航到示例文件夹。
运行Setup.cmd。
验证数据库
ContosoHR
和InstanceStore
是否已在 SQL Express 中创建。
设置执行解决方案
以管理员身份运行 Visual Studio。 打开HiringRequest.sln。
在 解决方案资源管理器 中右键单击解决方案,然后选择 “属性”。
选择 “多个启动项目 ”选项,并将 CareersWebSite、 InternalClient、 HiringRequestService 和 ResumeRequestService 设置为 Start。 将 ContosoHR、 InboxService 和 OrgService 保留为 None。
按 Ctrl+Shift+B 生成解决方案。 验证生成是否成功。
运行解决方案
解决方案生成后,按 Ctrl+F5 运行而不进行调试。 验证是否已启动所有服务。
右键单击解决方案中的 InternalClient ,然后选择 “在浏览器中查看”。 随即显示
InternalClient
的默认页。 确保服务正在运行,然后单击链接。将显示 HiringRequest 模块。 可以遵循如下详述的场景。
一旦
HiringRequest
完成,你可以启动ResumeRequest
。 可以遵循如下详述的场景。发布
ResumeRequest
时,信息将显示在公共网站(Contoso 工作机会网站)中。 若要查看职位发布(并申请职位),请导航到“职业网站”。在解决方案中右键单击 “CareersWebSite” ,然后选择“ 在浏览器中查看”。
导航回到
InternalClient
,在解决方案中右键单击InternalClient,然后选择在浏览器中查看。单击收件箱顶部菜单中的“职位发布”链接,转到“职位发布”部分。 可以遵循如下详述的场景。
情境
招聘请求
迈克尔·亚历山大(软件工程师)希望在工程部门申请一个招聘测试软件工程师(SDET)的新职位,要求应聘者至少具备3年的C#经验。
创建后,请求会显示在迈克尔的收件箱中(如果看不到请求,请单击“ 刷新 ”),等待彼得·布雷姆的批准,他是迈克尔的经理。
彼得想根据迈克尔的要求采取行动。 他认为这个职位需要 5 年的 C# 经验,而不是 3 年,所以他把他的评论发回审查。
迈克尔在他的收件箱中看到一条来自经理的消息,并打算采取行动。迈克尔查看了职位请求的历史记录,并同意彼得的意见。 Michael 修改说明以要求 5 年的 C# 工作经验,并接受修改。
彼得按照迈克尔修改后的请求行事并接受了请求。 现在,该请求必须由工程总监茨维·雷特批准。
Tsvi Reiter 希望迅速发出此请求,因此,他加上一条注释,说明此请求非常紧急并接受它。
请求现在必须得到两位人力资源经理或首席执行官的批准。 首席执行官布赖恩·理查德·戈德斯坦看到了茨维的紧急要求。 他接受请求,从而绕过了两名人力资源经理的批准。
该请求已从迈克尔的收件箱中删除,招聘 SDET 的过程现已开始。
启动简历请求
现在,该职位正等待发布到一个外部网站,人们可以在该网站申请(你可以通过点击 “职位发布” 链接来查看)。 目前,该职位正由负责敲定并发布职位的人力资源代表处理。
HR 希望编辑此招聘启事(通过单击“编辑”链接)将超时设置为 60 分钟(现实生活中,此值可以是几天或几个星期)。 超时允许根据指定的时间从外部网站中删除此招聘启事。
保存编辑的作业位置后,它将显示在“ 接收简历 ”选项卡中(刷新网页以查看新作业位置)。
收集简历
作业位置应显示在外部网站上。 作为有兴趣申请该职位的人员,您可以申请此职位并提交简历。
如果返回到作业发布列表服务,则可以“查看到目前为止收集的简历”。
HR 还可以停止收集简历(例如,一旦确定合适的候选人)。
故障排除
确保使用管理员权限运行 Visual Studio。
如果解决方案无法生成,请验证以下内容:
- 在
ContosoHR
或InternalClient
项目中,CareersWebSite
的引用并没有缺失。
- 在
如果解决方案无法执行,请验证以下内容:
所有服务都在运行。
服务引用已更新。
打开App_WebReferences文件夹
右键单击 Contoso 并选择“ 更新 Web/服务引用”。
在 Visual Studio 中按 Ctrl+Shift+B 重新生成解决方案。
卸载
通过运行位于 DbSetup 文件夹中的 Cleanup.bat删除 SQL Server 实例存储。
删除硬盘驱动器中的源代码。