HiringProcess 샘플은 메시징 활동과 워크플로 서비스로 호스트되는 두 개의 워크플로를 사용하여 비즈니스 프로세스를 구현하는 방법을 보여 줍니다. 이러한 워크플로는 Contoso, Inc.라는 가상 회사의 IT 인프라의 일부입니다.
HiringRequest
워크플로 프로세스(aFlowchart로 구현됨)는 조직의 여러 관리자로부터 권한 부여를 요청합니다. 이 목표를 달성하기 위해 워크플로는 조직의 다른 기존 서비스(이 경우 받은 편지함 서비스 및 일반 WCF(Windows Communication Foundation) 서비스로 구현된 조직 데이터 서비스)를 사용합니다.
워크플로(ResumeRequest
으로 구현됨)는 Contoso의 외부 채용 웹 사이트에 구인 공고를 게시하고 입사 지원서 관리를 담당합니다. 채용 공고는 일정 기간(시간 제한이 만료될 때까지) 또는 Contoso의 직원이 이를 제거하기로 결정할 때까지 외부 웹 사이트에서 사용할 수 있습니다.
이 샘플에서는 .NET Framework 4.6.1의 다음 기능을 보여 줍니다.
워크플로 서비스.
메시징 활동.
콘텐츠 기반 상관 관계입니다.
사용자 지정 작업(선언적 및 코드 기반).
시스템에서 제공하는 SQL 서버의 지속성.
사용자 지정 PersistenceParticipant.
사용자 지정 추적.
ETW(Windows용 이벤트 추적) 추적
활동의 구성입니다.
Parallel 활동.
지속성 타이머(Delay 활동).
트랜잭션.
동일한 솔루션에 둘 이상의 워크플로가 있습니다.
프로세스에 대한 설명
Contoso, Inc.는 각 부서의 인원을 면밀히 제어하려고 합니다. 따라서 모든 직원이 새로운 채용 프로세스를 시작하려는 경우 채용이 실제로 발생하기 전에 채용 요청 프로세스 승인을 거쳐야 합니다. 이 프로세스를 고용 프로세스 요청(HiringRequestService 프로젝트에 정의됨)이라고 하며 다음 단계로 구성됩니다.
직원(요청자)이 채용 프로세스 요청을 시작합니다.
요청자의 관리자는 요청을 승인해야 합니다.
관리자는 요청을 거부할 수 있습니다.
관리자는 추가 정보를 요청자에게 반환할 수 있습니다.
- 요청자는 요청을 검토하고 관리자에게 다시 보냅니다.
관리자는 승인할 수 있습니다.
요청자의 관리자가 승인한 후 부서 소유자는 요청을 승인해야 합니다.
부서 소유자는 거부할 수 있습니다.
부서 소유자가 승인할 수 있습니다.
부서 소유자가 승인하면 프로세스에 2 명의 HR 관리자 또는 CEO의 승인이 필요합니다.
프로세스는 허용되거나 거부된 상태로 전환할 수 있습니다.
프로세스가 수락되면 워크플로의
ResumeRequest
새 인스턴스가 시작됩니다(ResumeRequest
서비스 참조를 통해 HiringRequest.csproj에 연결됨).
관리자가 신입 사원의 채용을 승인하면 HR은 적절한 후보자를 찾아야 합니다. 이 프로세스는 두 번째 워크플로(ResumeRequest
ResumeRequestService.csproj에 정의됨)에 의해 수행됩니다. 이 워크플로는 Contoso의 외부 경력 웹 사이트에 경력 기회가 있는 채용 공고를 제출하는 프로세스를 정의하고, 지원자로부터 이력서를 받고, 채용 공고 상태를 모니터링합니다. 정해진 기간(시간이 만료될 때까지) 또는 Contoso의 직원이 이를 제거하기로 결정할 때까지 직책을 사용할 수 있습니다. 워크플로는 ResumeRequest
다음 단계로 구성됩니다.
Contoso의 직원은 위치 및 시간 제한 기간에 대한 정보를 입력합니다. 직원이 이 정보를 형식화하면 해당 위치가 경력 웹 사이트에 게시됩니다.
정보가 게시되면 이해 관계자가 이력서를 제출할 수 있습니다. 이력서가 제출되면 작업 열기에 연결된 레코드에 저장됩니다.
지원자는 제한 시간이 만료되거나 Contoso HR 부서의 누군가가 프로세스를 중지하여 게시를 제거하기로 명시적으로 결정할 때까지 이력서를 제출할 수 있습니다.
샘플의 프로젝트
다음 표에서는 샘플 솔루션의 프로젝트를 보여줍니다.
프로젝트 | 설명 |
---|---|
ContosoHR 인사 관리 시스템 | 데이터 계약, 비즈니스 개체 및 리포지토리 클래스를 포함합니다. |
HiringRequestService | 고용 요청 프로세스 워크플로의 정의를 포함합니다. 이 프로젝트는 워크플로(xaml 파일)를 서비스로 자체 호스팅하는 콘솔 애플리케이션으로 구현됩니다. |
ResumeRequestService | 제한 시간이 만료되거나 다른 사용자가 프로세스를 중지해야 한다고 결정할 때까지 후보자로부터 이력서를 수집하는 워크플로 서비스입니다. 이 프로젝트는 선언적 워크플로 서비스(xamlx)로 구현됩니다. |
OrgService | 조직 정보(직원, 직책, PositionTypes 및 부서)를 노출하는 서비스입니다. 이 서비스를 ERP(Enterprise Resource Plan)의 회사 조직 모듈로 생각할 수 있습니다. 이 프로젝트는 WCF(Windows Communication Foundation) 서비스를 노출하는 콘솔 애플리케이션으로 구현됩니다. |
인박스 서비스 | 직원을 위한 실행 가능한 업무가 포함된 받은 편지함입니다. 이 프로젝트는 WCF 서비스를 노출하는 콘솔 애플리케이션으로 구현됩니다. |
InternalClient | 프로세스와 상호 작용하기 위한 웹 애플리케이션입니다. 사용자는 자신의 HiringProcess 워크플로를 시작, 참여 및 볼 수 있습니다. 이 애플리케이션을 사용하여 ResumeRequest 프로세스를 시작하고 모니터링할 수도 있습니다. 이 사이트는 Contoso의 인트라넷 내부로 구현됩니다. 이 프로젝트는 ASP.NET 웹 사이트로 구현됩니다. |
CareersWebSite | Contoso에서 열린 위치를 노출하는 외부 웹 사이트입니다. 모든 잠재적 후보자는 이 사이트로 이동하여 이력서를 제출할 수 있습니다. |
기능 요약
다음 표에서는 이 샘플에서 각 기능을 사용하는 방법을 설명합니다.
특징 | 설명 | 프로젝트 |
---|---|---|
순서도 | 비즈니스 프로세스는 흐름도로 표현됩니다. 이 순서도 설명은 비즈니스에서 화이트보드에 그린 것과 동일한 방식으로 프로세스를 나타냅니다. | 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의 추적 폴더에 있습니다. |
HiringRequestService |
ETW 추적 | 시스템 제공 ETW 추적은 HiringRequestService 서비스의 App.config 파일에 구성됩니다. | HiringRequestService |
활동 구성 | 프로세스 정의는 .의 자유 컴퍼지션을 Activity사용합니다. 순서도에는 동시에 다른 작업(등)이 포함된 여러 시퀀스 및 병렬 작업이 포함됩니다. | HiringRequestService |
병렬 작업 |
-
ParallelForEach<T> 는 CEO 및 HR 관리자의 받은 편지함에 병렬로 등록하는 데 사용됩니다(두 명의 HR 관리자 승인 단계 대기). - Parallel 는 완료 및 거부된 단계에서 일부 정리 작업을 수행하는 데 사용됩니다. |
HiringRequestService |
모델 취소 | 흐름도는 CancellationScope를 사용하여 취소 동작을 만듭니다 (이 경우 일부 정리를 수행합니다). | HiringRequestService |
고객 유지 참여자 |
HiringRequestPersistenceParticipant 는 워크플로 변수의 데이터를 Contoso HR 데이터베이스에 저장된 테이블로 저장합니다. |
HiringRequestService |
Workflow Services |
ResumeRequestService 는 워크플로 서비스를 사용하여 구현됩니다. 워크플로 정의 및 서비스 정보는 ResumeRequestService.xamlx에 포함되어 있습니다. 서비스는 지속성 및 추적을 사용하도록 구성됩니다. |
ResumeRequestService |
지속성 타이머 |
ResumeRequestService 는 지속성 타이머를 사용하여 작업 게시 기간을 정의합니다(제한 시간이 만료되면 채용 공고가 닫힌 경우). |
재개요청서비스 |
트랜잭션 | TransactionScope 는 여러 활동의 실행 내에서 데이터의 일관성을 보장하는 데 사용됩니다(새 이력서가 수신될 때). | ResumeRequestService |
트랜잭션 | 사용자 지정 지속성 참가자(HiringRequestPersistenceParticipant ) 및 사용자 지정 추적 참가자()는HistoryFileTrackingParticipant 동일한 트랜잭션을 사용합니다. |
HiringRequestService |
ASP.NET 애플리케이션에서 WF 사용. | 워크플로는 두 ASP.NET 애플리케이션에서 액세스됩니다. | InternalClient / CareersWebSite |
데이터 스토리지
데이터는 ContosoHR
라고 하는 SQL Server 데이터베이스에 저장됩니다(이 데이터베이스를 만들기 위한 스크립트는 DbSetup
폴더에 있음). 워크플로 인스턴스는 호출 InstanceStore
된 SQL Server 데이터베이스에 저장됩니다(인스턴스 저장소를 만들기 위한 스크립트는 .NET Framework 4.6.1 배포의 일부임).
두 데이터베이스는 Visual Studio용 개발자 명령 프롬프트에서 Setup.cmd 스크립트를 실행하여 만들어집니다.
샘플 실행
데이터베이스를 만들려면
Visual Studio용 개발자 명령 프롬프트를 엽니다.
샘플 폴더로 이동합니다.
Setup.cmd 실행합니다.
두 데이터베이스가 SQL Express에서 생성되었는지 확인합니다
ContosoHR
InstanceStore
.
실행을 위한 솔루션을 설정하려면
관리자 권한으로 Visual Studio를 실행합니다. HiringRequest.sln 엽니다.
솔루션 탐색기에서 솔루션을 마우스 오른쪽 단추로 클릭하고 속성을 선택합니다.
여러 시작 프로젝트 옵션을 선택하고 CareersWebSite, InternalClient, HiringRequestService 및 ResumeRequestService를 시작으로 설정합니다. ContosoHR, InboxService 및 OrgService를 None으로 유지합니다.
Ctrl+Shift+B를 눌러 솔루션을 빌드합니다. 빌드가 성공했는지 확인합니다.
솔루션을 실행하려면
솔루션이 빌드된 후 Ctrl+F5를 눌러 디버깅하지 않고 실행합니다. 모든 서비스가 시작되었는지 확인합니다.
솔루션에서 InternalClient 를 마우스 오른쪽 단추로 클릭한 다음 브라우저에서 보기를 선택합니다. 기본 페이지
InternalClient
가 표시됩니다. 서비스가 실행 중인지 확인하고 링크를 클릭합니다.HiringRequest 모듈이 표시됩니다. 여기에 자세히 설명된 시나리오를 따를 수 있습니다.
HiringRequest
이 완료되면,ResumeRequest
을 시작할 수 있습니다. 여기에 자세히 설명된 시나리오를 따를 수 있습니다.ResumeRequest
게시되면 공용 웹 사이트(Contoso 경력 웹 사이트)에서 사용할 수 있습니다. 채용 공고(및 채용 신청)를 보려면 경력 웹 사이트로 이동합니다.솔루션에서 CareersWebSite 를 마우스 오른쪽 단추로 클릭하고 브라우저에서 보기를 선택합니다.
솔루션에서
InternalClient
InternalClient 를 마우스 오른쪽 단추로 클릭하고 브라우저에서 보기를 선택하여 다시 이동합니다.받은 편지함 상단 메뉴에서 작업 게시 링크를 클릭하여 JobPostings 섹션으로 이동합니다. 여기에 자세히 설명된 시나리오를 따를 수 있습니다.
시나리오
채용 요청
Michael Alexander(소프트웨어 엔지니어)는 C#에서 3년 이상의 경험을 가진 엔지니어링 부서의 SDET(Software Engineer in Test)을 고용하기 위한 새로운 직책을 요청하고자 합니다.
생성된 후 요청은 Michael의 관리자인 Peter Brehm의 승인을 기다리는 마이클의 받은 편지함(요청이 표시되지 않으면 새로 고침 클릭)에 나타납니다.
베드로는 미가엘의 요청에 따라 행동하고 싶어한다. 그는 이 직책이 3년이 아닌 5년의 C# 경험을 요구한다고 생각하기 때문에 검토를 위해 자신의 의견을 다시 보냅니다.
마이클은 받은 편지함에서 매니저의 메시지를 보고 조치를 취하고 싶어합니다. 마이클은 직책 요청의 내역을 보고 피터에게 동의합니다. Michael은 5년의 C# 환경을 요구하도록 설명을 수정하고 수정을 수락합니다.
베드로는 미가엘의 수정된 요청에 따라 행동하고 그것을 받아들인다. 이제 요청은 엔지니어링 디렉터 Tsvi Reiter의 승인을 받아야 합니다.
Tsvi Reiter는 요청을 신속하게 처리하려고 하므로 요청이 시급하다는 의견을 제시하고 수락합니다.
이제 두 명의 HR 관리자 또는 CEO가 요청을 승인해야 합니다. 브라이언 리처드 골드스타인 CEO는 Tsvi의 긴급 요청을 확인한다. 그는 이를 수락하여 요청에 따라 행동하므로 두 명의 HR 관리자의 승인을 우회합니다.
요청이 Michael의 받은 편지함에서 제거되고 SDET를 고용하는 프로세스가 시작되었습니다.
다시 시작 요청
이제 작업 위치가 사용자가 신청할 수 있는 외부 웹 사이트에 게시되기를 기다리고 있습니다( 채용 공 고 링크를 클릭하는 것을 볼 수 있습니다). 현재 직무는 HR 담당자가 최종 결정하고 게시할 책임이 있습니다.
HR은 60분의 제한 시간을 설정하여( 편집 링크를 클릭하여) 이 작업 위치를 편집하려고 합니다(실제 상황에서는 며칠 또는 몇 주가 될 수 있음). 제한 시간을 사용하면 지정된 시간에 따라 외부 웹 사이트에서 작업 위치를 벗어날 수 있습니다.
편집된 채용 공고를 저장한 후, 이력서 수령 탭에 표시됩니다(새로운 채용 공고를 보려면 웹 페이지를 새로 고침하세요).
이력서 수집
작업 위치는 외부 웹 사이트에 표시되어야 합니다. 이 직무에 지원하려는 사람은 이 직책을 신청하고 이력서를 제출할 수 있습니다.
채용 공고 목록 서비스로 돌아가면 지금까지 수집된 "이력서를 볼 수 있습니다".
HR은 또한 이력서 수집을 중지할 수 있습니다(예: 올바른 후보가 식별되면).
문제 해결
관리자 권한으로 Visual Studio를 실행하고 있는지 확인합니다.
솔루션을 빌드하지 못한 경우 다음을 확인합니다.
-
ContosoHR
에 대한 참조는InternalClient
또는CareersWebSite
프로젝트에서 누락되지 않았습니다.
-
솔루션이 실행되지 않는 경우 다음을 확인합니다.
모든 서비스가 실행 중입니다.
서비스 참조가 업데이트됩니다.
App_WebReferences 폴더 열기
Contoso를 마우스 오른쪽 단추로 클릭하고 웹/서비스 참조 업데이트를 선택합니다.
Visual Studio에서 Ctrl+Shift+B를 눌러 솔루션을 다시 빌드합니다.
프로그램 제거
DbSetup 폴더에 있는 Cleanup.bat실행하여 SQL Server 인스턴스 저장소를 삭제합니다.
하드 드라이브를 형성하는 소스 코드를 삭제합니다.
.NET