企業の購買プロセス

PurchaseProcess サンプルは、提案要求 (RFP) に基づくごく基本的な購買プロセスを作成する方法を示しています。この購買プロセスでは最良の提案が自動的に選択されます。 このサンプルでは、ParallelParallelForEach<T>、および ForEach<T> と、プロセスを表すワークフローを作成するカスタム アクティビティが組み合わされています。

このサンプルには、さまざまな参加者として (元の要求者や特定のベンダーとして) プロセスとやり取りできる ASP.NET クライアント アプリケーションが含まれています。

対象

  • カスタム アクティビティ。

  • アクティビティの構成。

  • ブックマーク

  • 永続性。

  • スキーマ化された永続化。

  • トレース。

  • 追跡。

  • さまざまなクライアント (ASP.NET Web アプリケーションと WinForms アプリケーション) での WF のホスティング。

プロセスの説明

このサンプルは、任意の会社のためにベンダーからの提案を集める Windows Workflow Foundation (WF) プログラムの実装を示しています。

  1. Company X の従業員が Request for Proposal (RFP) を作成します。

    1. RFP のタイトルと説明を入力します。

    2. 提案の送信を依頼するベンダーを選択します。

  2. 従業員が提案を送信します。

    1. ワークフローのインスタンスが作成されます。

    2. ワークフローは、すべてのベンダーから提案が送信されるまで待機します。

  3. すべての提案が受信されると、それらがワークフローによって反復処理されて、最良の提案が選択されます。

    1. ベンダーにはそれぞれ評価があります (評価リストは VendorRepository.cs に格納されています)。

    2. 提案の合計金額は、(ベンダーによって入力された金額) * (記録されているベンダーの評価) / 100 という式によって決定されます。

  4. 元の要求者は、送信されたすべての提案を表示できます。 最良の提案はレポートの特別なセクションに表示されます。

プロセスの定義

このサンプルのコア ロジックでは ParallelForEach<T> アクティビティが使用されています。このアクティビティは、各ベンダーからの提案を待機して (ブックマークを作成するカスタム アクティビティを使用)、ベンダーの提案を RFP として登録します (InvokeMethod アクティビティを使用)。

その後、RfpRepository に格納されている受信したすべての提案が反復処理されて、調整金額が計算されます (Assign アクティビティと System.Activities.Expressions アクティビティを使用)。調整金額が前の最良の提案より優れている場合は、その新しい金額が最良の提案に割り当てられます (If アクティビティと Assign アクティビティを使用)。

このサンプルのプロジェクト

このサンプルには次のプロジェクトが含まれています。

プロジェクト 説明
共通 プロセス内で使用されるエンティティ オブジェクト (Request for Proposal、Vendor、および Vendor Proposal)。
WfDefinition 購買プロセス ワークフローのインスタンスの作成および使用のためにクライアント アプリケーションによって使用されるプロセス (WF プログラムとしてのプロセス) とホスト (PurchaseProcessHost) の定義。
WebClient 購買プロセスのインスタンスを作成したりそれに参加したりできる ASP.NET クライアント アプリケーション。 独自に作成したホストを使用してワークフロー エンジンとやり取りします。
WinFormsClient 購買プロセスのインスタンスを作成したりそれに参加したりできる Windows フォーム クライアント アプリケーション。 独自に作成したホストを使用してワークフロー エンジンとやり取りします。

WfDefinition

次の表には、WfDefinition プロジェクトの最も重要なファイルの説明が含まれています。

ファイル 説明
IPurchaseProcessHost.cs ワークフローのホストのインターフェイス。
PurchaseProcessHost.cs ワークフローのホストの実装。 ホストは、ワークフロー ランタイムの詳細を抽象化します。PurchaseProcess ワークフローのインスタンスの読み込み、実行、およびインスタンスとのやり取りのために、すべてのクライアント アプリケーションで使用されます。
PurchaseProcessWorkflow.cs Purchase Process ワークフローの定義を含むアクティビティ (Activity から派生します)。

Activity から派生するアクティビティは、既存のカスタム アクティビティと .NET Framework 4.6.1 アクティビティ ライブラリのアクティビティをまとめることで機能を構成します。 これらのアクティビティをまとめることは、カスタム機能を作成するための最も基本的な方法です。
WaitForVendorProposal.cs このカスタム アクティビティは NativeActivity から派生し、後にベンダーが提案を送信するときに再開する必要がある名前付きブックマークを作成します。

NativeActivity から派生するアクティビティは、CodeActivity から派生するアクティビティと同様に、Execute をオーバーライドすることで、命令型機能を作成します。ただし、ActivityContext メソッドに渡される Execute を介して、ワークフロー ランタイムのすべての機能にもアクセスできます。 このコンテキストでは、子アクティビティのスケジュールと取り消し、非永続化ゾーン (アトミック トランザクションの中など、ランタイムによってワークフローのデータが永続化されない実行ブロック) の設定、および Bookmark オブジェクト (一時停止したワークフローの再開を処理) がサポートされています。
TrackingParticipant.cs すべての追跡イベントを受信してテキスト ファイルに保存する TrackingParticipant

追跡参加要素は拡張としてワークフロー インスタンスに追加されます。
XmlWorkflowInstanceStore.cs ワークフロー アプリケーションを XML ファイルに保存するカスタムの InstanceStore
XmlPersistenceParticipant.cs Request for Proposal のインスタンスを XML ファイルに保存するカスタムの PersistenceParticipant
AsyncResult.cs / CompletedAsyncResult.cs 永続化コンポーネントに非同期パターンを実装するためのヘルパー クラス。

共通

次の表には、Common プロジェクトの最も重要なクラスの説明が含まれています。

クラス 説明
ベンダー Request for Proposals で提案を送信するベンダー。
RequestForProposal Request for Proposals (RFP) は、ベンダーに特定の商品またはサービスについての提案の送信を求める依頼書です。
VendorProposal ベンダーによって具象 RFP に送信された提案。
VendorRepository Vendor のリポジトリ。 この実装には、Vendor のインスタンスのメモリ内コレクションと、それらのインスタンスを公開するためのメソッドが含まれています。
RfpRepository Request for Proposals のリポジトリ。 この実装は、Linq to XML を使用して、スキーマ化された永続化によって生成された Request for Proposal の XML ファイルをクエリします。
IOHelper このクラスは、I/O 関連のすべての問題を処理します (フォルダー、パスなど)。

Web クライアント

次の表には、Web Client プロジェクトの最も重要な Web ページの説明が含まれています。

ファイル 説明
CreateRfp.aspx 新しい Request for Proposals を作成して送信します。
Default.aspx アクティブな Request for Proposals と完了した Request for Proposals をすべて表示します。
GetVendorProposal.aspx 具象 Request for Proposals 内のベンダーからの提案を取得します。 このページを使用するのはベンダーだけです。
ShowRfp.aspx Request for Proposals に関するすべての情報 (受信した提案、日付、金額、およびその他の情報) を表示します。 このページを使用するのは Request for Proposal の作成者だけです。

WinForms Client

次の表には、WinForms Client プロジェクトの最も重要なフォームの説明が含まれています。

フォーム 説明
NewRfp 新しい Request for Proposals を作成して送信します。
ShowProposals アクティブな Request for Proposals と完了した Request for Proposals をすべて表示します。 注: Request for Proposal を作成または変更した後にこの画面に変更内容が表示されない場合は、UI の [更新] ボタンをクリックしてください。
SubmitProposal 具象 Request for Proposals 内のベンダーからの提案を取得します。 このウィンドウを使用するのはベンダーだけです。
ViewRfp Request for Proposals に関するすべての情報 (受信した提案、日付、金額、およびその他の情報) を表示します。 このウィンドウを使用するのは Request for Proposals の作成者だけです。

永続化ファイル

次の表は、永続化プロバイダー (XmlPersistenceProvider) によって生成されるファイルを示しています。これらのファイルは、現在のシステムの一時フォルダーのパスに配置されます (GetTempPath を使用)。 トレース ファイルは現在の実行パスに作成されます。

ファイル名 説明 Path
rfps.xml アクティブな Request for Proposals と完了した Request for Proposals をすべて含む 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 Client プロジェクトを実行するには、ソリューション エクスプローラーを開き、 [Web Client] プロジェクトを右クリックして、 [スタートアップ プロジェクトに設定] をクリックします。

  3. WinForms Client プロジェクトを実行するには、ソリューション エクスプローラーを開き、 [WinForms Client] プロジェクトを右クリックして、 [スタートアップ プロジェクトに設定] をクリックします。

  4. ソリューションをビルドするには、Ctrl キーと Shift キーを押しながら B キーを押します。

  5. ソリューションを実行するには、Ctrl キーを押しながら F5 キーを押します。

Web Client のオプション

  • 新しい rfp を作成: 新しい Request for Proposals (RFP) を作成し、Purchase Process ワークフローを開始します。

  • 更新: メイン ウィンドウの [Active and Finished RFPs] の一覧を更新します。

  • View: 既存の RFP の内容を表示します。 ベンダーは自身の提案を送信できます (依頼されている場合。依頼されていない場合は RFP が完了していません)。

  • View As: さまざまな ID を使用して RFP にアクセスできます。そのためには、アクティブな RFP のグリッドの [View as] ボックスで目的の参加者を選択します。

WinForms Client のオプション

  • Rfp の作成: 新しい Request for Proposals (RFP) を作成し、Purchase Process ワークフローを開始します。

  • 更新: メイン ウィンドウの [Active and Finished RFPs] の一覧を更新します。

  • Rfp の表示: 既存の RFP の内容を表示します。 ベンダーは自身の提案を送信できます (依頼されている場合。依頼されていない場合は RFP が完了していません)。

  • Connect As: さまざまな ID を使用して RFP にアクセスできます。そのためには、アクティブな RFP のグリッドの [View as] ボックスで目的の参加者を選択します。