HiringProcess サンプルでは、メッセージング アクティビティとワークフロー サービスとしてホストされる 2 つのワークフローを使用してビジネス プロセスを実装する方法を示します。 これらのワークフローは、Contoso, Inc. という架空の会社の IT インフラストラクチャの一部です。
HiringRequest
ワークフロー プロセス (Flowchartとして実装) は、組織内の複数のマネージャーからの承認を求めます。 この目標を達成するために、ワークフローは組織内の他の既存のサービス (ここでは、受信トレイ サービスと、プレーンな Windows Communication Foundation (WCF) サービスとして実装された組織データ サービス) を使用します。
ResumeRequest
ワークフロー (Sequenceとして実装) は、Contoso の外部キャリア Web サイトに求人情報を公開し、履歴書の取得を管理します。 外部 Web サイトでは、一定期間 (タイムアウトが切れるまで) または Contoso の従業員が削除を決定するまで、ジョブの投稿を利用できます。
このサンプルでは、.NET Framework 4.6.1 の次の機能を示します。
ワークフロー サービス。
メッセージング アクティビティ。
コンテンツ ベースの相関関係。
カスタム アクティビティ (宣言型とコードベース)。
システムによって提供される SQL サーバーの永続化。
カスタム PersistenceParticipant。
カスタム追跡。
Windows のイベント追跡 (ETW) 追跡。
アクティビティの構成。
Parallel 活動。
持続的タイマー (Delay アクティビティ)。
トランザクション。
同じソリューション内の複数のワークフロー。
プロセスの説明
Contoso, Inc. は、各部門の人員を細かく管理したいと考えています。 そのため、従業員が新しい採用プロセスを開始する場合は、採用が実際に行われる前に、採用要求プロセスの承認を受ける必要があります。 このプロセスは、採用プロセス要求 (HiringRequestService プロジェクトで定義) と呼ばれ、次の手順で構成されます。
従業員 (要求元) が採用プロセス要求を開始します。
要求元のマネージャーは、要求を承認する必要があります。
マネージャーは要求を拒否できます。
マネージャーは、要求を要求元に返して追加情報を取得できます。
- 要求者は要求を確認し、マネージャーに送り返します。
マネージャーは承認できます。
要求者のマネージャーが承認した後、部門の所有者は要求を承認する必要があります。
部署の所有者は拒否できます。
部門の所有者は承認できます。
部門の所有者が承認した後、プロセスには 2 人の人事マネージャーまたは CEO の承認が必要です。
プロセスは、受け入れられた状態または拒否された状態に移行できます。
プロセスが Accepted の場合、
ResumeRequest
ワークフローの新しいインスタンスが開始されます (ResumeRequest
は、サービス参照を介して HiringRequest.csproj にリンクされます)。
マネージャーが新しい従業員の雇用を承認したら、人事担当者は適切な候補者を見つける必要があります。 このプロセスは、2 番目のワークフロー (ResumeRequestService.csproj で定義ResumeRequest
) によって実行されます。 このワークフローでは、Contoso の外部のキャリア Web サイトにキャリアの機会を持つ求人を送信するプロセスを定義し、申請者から履歴書を受け取り、求人の状態を監視します。 ポジションは、一定の期間 (期限切れになるまで) または Contoso の従業員が削除を決定するまで利用できます。
ResumeRequest
ワークフローは、次の手順で構成されます。
Contoso の従業員は、ポジションとタイムアウト期間に関する情報を入力します。 従業員がこの情報を入力すると、その役職がキャリア Web サイトに投稿されます。
情報が公開されると、関係者は履歴書を提出できます。 履歴書が送信されると、ジョブの開始にリンクされたレコードに保存されます。
申請者は、タイムアウトが切れるまで、または Contoso 人事部の誰かがプロセスを停止して投稿を削除することを明示的に決定するまで、履歴書を提出できます。
サンプル内のプロジェクト
次の表に、サンプル ソリューションのプロジェクトを示します。
プロジェクト | 説明 |
---|---|
ContosoHR | データ コントラクト、ビジネス オブジェクト、およびリポジトリ クラスが含まれます。 |
HiringRequestService | 雇用要求プロセス ワークフローの定義を格納します。 このプロジェクトは、ワークフロー (xaml ファイル) をサービスとして自己ホストするコンソール アプリケーションとして実装されます。 |
ResumeRequestService | タイムアウトが切れるか、プロセスを停止する必要があると判断するまで、候補者から履歴書を収集するワークフロー サービス。 このプロジェクトは、宣言型ワークフロー サービス (xamlx) として実装されます。 |
OrgService | 組織情報 (Employees、Positions、PositionTypes、Departments) を公開するサービス。 このサービスは、エンタープライズ リソース プラン (ERP) の会社組織モジュールと考えることができます。 このプロジェクトは、Windows Communication Foundation (WCF) サービスを公開するコンソール アプリケーションとして実装されます。 |
InboxService | 従業員の操作可能なタスクを含む受信トレイ。 このプロジェクトは、WCF サービスを公開するコンソール アプリケーションとして実装されます。 |
InternalClient | プロセスと対話するための Web アプリケーション。 ユーザーは、自分の HiringProcess ワークフローを開始、参加、および表示できます。 このアプリケーションを使用して、ResumeRequest プロセスを開始および監視することもできます。 このサイトは、Contoso のイントラネットの内部に実装されています。 このプロジェクトは、ASP.NET Web サイトとして実装されます。 |
CareersWebSite | Contoso のオープンポジションを公開する外部 Web サイト。 潜在的な候補者は、このサイトに移動し、履歴書を送信できます。 |
機能の概要
次の表では、このサンプルで各機能がどのように使用されるかについて説明します。
特徴 | 説明 | プロジェクト |
---|---|---|
フローチャート | 業務プロセスはフローチャートとして表されます。 このフローチャートの説明は、企業がホワイトボードに描画したのと同じ方法でプロセスを表します。 | HiringRequestService |
ワークフロー サービス | プロセス定義を含むフローチャートは、サービスでホストされます (この例では、サービスはコンソール アプリケーションでホストされています)。 | HiringRequestService |
メッセージング アクティビティ | フローチャートでは、次の 2 つの方法でメッセージング アクティビティを使用します。 - ユーザーから情報を取得する (各承認ステップで決定と関連情報を受け取る)。 - 他の既存のサービス (InboxService と OrgDataService、サービス参照を通じて使用) と対話します。 |
HiringRequestService |
コンテンツ ベースの相関関係 | 承認メッセージは、採用要求の ID プロパティに関連付けられます。 - プロセスが開始されると、関連付けハンドルは要求の ID で初期化されます。 - 受信承認メッセージは ID に関連付けられます (各承認メッセージの最初のパラメーターは要求の ID です)。 |
HiringRequestService / ResumeRequestService |
カスタム アクティビティ (宣言型とコード ベース) | このサンプルには、いくつかのカスタム アクティビティがあります。 - SaveActionTracking : このアクティビティは、(Track を使用して) カスタム TrackingRecordを出力します。 このアクティビティは、 NativeActivityを拡張する命令型コードを使用して作成されています。- GetEmployeesByPositionTypes : このアクティビティは、位置の種類 ID の一覧を受け取り、Contoso でその位置を持つユーザーの一覧を返します。 このアクティビティは宣言によって作成されています (アクティビティ デザイナーを使用)。- SaveHiringRequestInfo : このアクティビティは、(HiringRequestRepository.Save を使用して) HiringRequest の情報を保存します。 このアクティビティは、 CodeActivityを拡張する命令型コードを使用して作成されています。 |
HiringRequestService |
システム提供の SQL Server 永続化 | Flowchart プロセス定義をホストする WorkflowServiceHost インスタンスは、システム提供の SQL Server 永続化を使用するように構成されます。 | HiringRequestService / ResumeRequestService |
カスタム追跡 | このサンプルには、 HiringRequestProcess の履歴を保存するカスタム追跡参加要素が含まれています (これにより、実行されたアクション、ユーザー、およびタイミングが記録されます)。 ソース コードは、HiringRequestService の追跡フォルダーにあります。 |
HiringRequestService |
ETW 追跡 | システム提供の ETW 追跡は、HiringRequestService サービスの App.config ファイルで構成されます。 | HiringRequestService |
活動の構成 | プロセス定義では、 Activityの自由な構成が使用されます。 フローチャートには、他のアクティビティ (など) が同時に含まれる複数のシーケンスアクティビティと並列アクティビティが含まれています。 | HiringRequestService |
並列アクティビティ |
-
ParallelForEach<T> は、CEO と人事マネージャーの受信トレイに並行して登録するために使用されます (2 人の人事マネージャーの承認ステップを待機しています)。 - Parallel は、完了した手順と拒否された手順でクリーンアップ タスクを実行するために使用されます。 |
HiringRequestService |
モデルの取り消し | フローチャートでは、 CancellationScope を使用してキャンセル動作を作成します (この場合、クリーンアップが行われます)。 | HiringRequestService |
顧客の永続化参加者 |
HiringRequestPersistenceParticipant は、ワークフロー変数から Contoso HR データベースに格納されているテーブルにデータを保存します。 |
HiringRequestService |
ワークフロー サービス |
ResumeRequestService はワークフロー サービスを使用して実装されます。 ワークフロー定義とサービス情報は ResumeRequestService.xamlx に含まれています。 このサービスは、永続化と追跡を使用するように構成されています。 |
ResumeRequestService |
持続的タイマー |
ResumeRequestService は永続的タイマーを使用して、ジョブの投稿の期間を定義します (タイムアウトが切れると、ジョブの投稿は閉じられます)。 |
ResumeRequestService |
トランザクション | TransactionScope は、(新しい履歴書を受信したときに) 複数のアクティビティの実行中にデータの一貫性を確保するために使用されます。 | ResumeRequestService |
トランザクション | カスタム永続化参加要素 (HiringRequestPersistenceParticipant ) とカスタム追跡参加要素 (HistoryFileTrackingParticipant ) は、同じトランザクションを使用します。 |
HiringRequestService |
ASP.NET アプリケーションでの WF の使用。 | ワークフローには、2 つの ASP.NET アプリケーションからアクセスします。 | InternalClient / CareersWebSite |
データ ストレージ
データは、 ContosoHR
と呼ばれる SQL Server データベースに格納されます (このデータベースを作成するためのスクリプトは、 DbSetup
フォルダーにあります)。 ワークフロー インスタンスは、 InstanceStore
と呼ばれる SQL Server データベースに格納されます (インスタンス ストアを作成するためのスクリプトは、.NET Framework 4.6.1 ディストリビューションの一部です)。
どちらのデータベースも、Visual Studio の開発者コマンド プロンプトから Setup.cmd スクリプトを実行して作成されます。
サンプルの実行
データベースを作成するには
Visual Studio の開発者コマンド プロンプトを開きます。
サンプル フォルダーに移動します。
Setup.cmdを実行します。
2 つのデータベース
ContosoHR
とInstanceStore
が SQL Express で作成されたことを確認します。
実行するソリューションを設定するには
管理者として Visual Studio を実行します。 HiringRequest.slnを開きます。
ソリューション エクスプローラーでソリューションを右クリックし、[プロパティ] を選択します。
[ 複数のスタートアップ プロジェクト ] オプションを選択し、[ CareersWebSite]、[ InternalClient]、[ HiringRequestService]、[ ResumeRequestService] を[開始] に設定します。 ContosoHR、InboxService、OrgService は None のままにします。
Ctrl + Shift + B キーを押してソリューションをビルドします。 ビルドが成功したことを確認します。
ソリューションを実行するには
ソリューションがビルドされたら、Ctrl キーを押しながら F5 キーを押してデバッグなしで実行します。 すべてのサービスが開始されたことを確認します。
ソリューションで InternalClient を右クリックし、[ ブラウザーで表示] を選択します。
InternalClient
の既定のページが表示されます。 サービスが実行されていることを確認し、リンクをクリックします。HiringRequest モジュールが表示されます。 ここで詳しく説明するシナリオに従うことができます。
HiringRequest
が完了したら、ResumeRequest
を開始できます。 ここで詳しく説明するシナリオに従うことができます。ResumeRequest
が投稿されると、パブリック Web サイト (Contoso Careers Web サイト) で使用できます。 求人情報を表示 (および採用申請) するには、キャリア Web サイトに移動します。ソリューションで [CareersWebSite ] を右クリックし、[ ブラウザーで表示] を選択します。
ソリューションで InternalClient を右クリックし、[ブラウザーで表示] を選択して、
InternalClient
に戻ります。受信トレイの上部メニューの [求人情報] リンクをクリックして、[JobPostings] セクションに移動します。 ここで詳しく説明するシナリオに従うことができます。
シナリオ
採用要求
Michael Alexander (ソフトウェア エンジニア) は、C# で 3 年以上の経験を持つエンジニアリング部門のテスト (SDET) でソフトウェア エンジニアを雇用するための新しいポジションを要求したいと考えています。
作成後、要求は Michael の受信トレイに表示され (要求が表示されない場合は [最新の情報に更新 ] をクリックします)、Michael のマネージャーである Peter Brehm の承認を待ちます。
Peter は、マイケルの要求に基づいて行動したいと考えています。 彼はポジションが3ではなく5年間のC#経験を必要とすると考えていますので、レビューのためにコメントを送り返します。
Michael は、上司から受信トレイにメッセージを見て、行動したいと考えています。マイケルはポジションリクエストの履歴を見て、Peter に同意します。 Michael は、5 年間の C# の経験を必要とするように説明を変更し、変更を受け入れます。
Peter は Michael の変更された要求に対して行動し、それを受け入れます。 要求は、Tsvi Reiter エンジニアリングディレクターによって承認される必要があります。
Tsvi Reiter は要求を迅速に行いたいと考えています。そのため、要求は緊急であるとコメントし、それを受け入れます。
要求は、2 人の人事マネージャーまたは CEO によって承認される必要があります。 CEOのブライアン・リチャード・ゴールドスタインは、Tsviの緊急の要求を見ている。 彼はそれを受け入れて要求に取り組み、2人の人事マネージャーによる承認をバイパスします。
要求は Michael の受信トレイから削除され、SDET を採用するプロセスが開始されました。
再開要求を開始する
これで、求人は、ユーザーが応募できる外部 Web サイトに投稿されるのを待っています ([ 求人情報 ] リンクをクリックすると表示されます)。 現在、役職は人事担当者と一緒に座り、職務の最終決定と投稿を担当しています。
HR は、60 分のタイムアウトを設定して ([ 編集] リンクをクリックして) このジョブの位置を編集したいと考えています (実際には、これは数日または数週間になる可能性があります)。 タイムアウトにより、指定された時間に従って、外部 Web サイトからジョブの位置を取得できます。
編集したジョブの位置を保存すると、[ 再開の受信 ] タブに表示されます (Web ページを更新して新しいジョブの位置を確認します)。
履歴書の収集
ジョブの位置は、外部 Web サイトに表示されます。 応募に関心のある方は、この役職に応募し、履歴書を提出することができます。
求人情報一覧サービスに戻ると、これまでに収集された「履歴書を表示」することができます。
HR は、履歴書の収集を停止することもできます (たとえば、適切な候補者が特定されたら)。
トラブルシューティング
管理者特権で Visual Studio を実行していることを確認します。
ソリューションのビルドに失敗した場合は、次のことを確認します。
-
ContosoHR
への参照が、InternalClient
またはCareersWebSite
プロジェクトにありません。
-
ソリューションの実行に失敗した場合は、次のことを確認します。
すべてのサービスが実行されています。
サービス参照が更新されます。
App_WebReferences フォルダーを開く
Contoso を右クリックし、[Web/サービス参照の更新] を選択します。
Visual Studio で Ctrl + Shift + B キーを押して、ソリューションをリビルドします。
アンインストール中
DbSetup フォルダーにある Cleanup.batを実行して、SQL Server インスタンス ストアを削除します。
ハード ドライブからソース コードを削除します。
.NET