次の方法で共有


企業購入プロセス

PurchaseProcess サンプルでは、提案に対する非常に基本的な要求 (RFP) ベースの購入プロセスを作成し、最適な提案を自動的に選択する方法を示します。 ParallelParallelForEach<T>ForEach<T>とカスタム アクティビティを組み合わせて、プロセスを表すワークフローを作成します。

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

対象

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

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

  • ブックマーク。

  • 固執。

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

  • トレーシング。

  • トラッキング。

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

プロセスの説明

このサンプルでは、汎用企業のベンダーからの提案を収集するための Windows Workflow Foundation (WF) プログラムの実装を示します。

  1. X 社の従業員が提案依頼 (RFP) を作成します。

    1. RFP のタイトルと説明の従業員の種類。

    2. 従業員は、提案を送信するために招待する仕入先を選択します。

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

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

    2. ワークフローは、すべてのベンダーが提案を送信するのを待っています。

  3. すべての提案を受け取った後、ワークフローは受信したすべての提案を反復処理し、最適なものを選択します。

    1. 各ベンダーには評判があります (このサンプルでは、評判リストをVendorRepository.csに格納します)。

    2. 提案の合計値は、(仕入先によって入力された値) * (仕入先の記録された評判) / 100 によって決定されます。

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

プロセス定義

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

次に、このサンプルでは、 RfpRepositoryに格納されているすべての受信提案を反復処理し、調整された値 ( Assign アクティビティと System.Activities.Expressions アクティビティを使用) を計算し、調整された値が以前の最適なオファーよりも優れている場合は、新しい値を最適なオファーとして割り当てます ( IfAssign アクティビティを使用)。

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

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

プロジェクト 説明
共通 プロセス内で使用されるエンティティ オブジェクト (提案、仕入先、仕入先提案の要求)。
WfDefinition 購入プロセス ワークフローのインスタンスを作成および使用するためにクライアント アプリケーションによって使用されるプロセス (WF プログラムとして) およびホスト (PurchaseProcessHost) の定義。
WebClient ユーザーが購入プロセスのインスタンスを作成して参加できるようにする ASP.NET クライアント アプリケーション。 カスタムで作成されたホストを使用してワークフロー エンジンと対話します。
WinFormsClient ユーザーが購入プロセスのインスタンスを作成して参加できるようにする Windows フォーム クライアント アプリケーション。 カスタムで作成されたホストを使用してワークフロー エンジンと対話します。

WfDefinition

次の表に、WfDefinition プロジェクトで最も重要なファイルの説明を示します。

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

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

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

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

共通

次の表に、Common プロジェクトの最も重要なクラスの説明を示します。

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

Web クライアント

次の表に、Web クライアント プロジェクトの最も重要な Web ページの説明を示します。

ファイル 説明
CreateRfp.aspx 提案の新しい要求を作成して送信します。
Default.aspx すべてのアクティブな要求と完了した提案の要求を表示します。
GetVendorProposal.aspx 提案の具体的な要求でベンダーから提案を取得します。 このページはベンダーのみが使用します。
ShowRfp.aspx 提案の要求 (受信した提案、日付、値、およびその他の情報) に関するすべての情報を表示します。 このページは、提案依頼の作成者のみが使用します。

WinForms クライアント

次の表に、Win フォーム プロジェクトの最も重要なフォームの説明を示します。

フォーム 説明
NewRfp 提案の新しい要求を作成して送信します。
ShowProposals すべてのアクティブな要求と完了した提案の要求を表示します。 手記: 提案の要求を作成または変更した後、UI の [ 更新 ] ボタンをクリックしてその画面に変更を表示することが必要な場合があります。
SubmitProposal 提案の具体的な要求でベンダーから提案を取得します。 このウィンドウはベンダーのみが使用します。
ViewRfp 提案の要求 (受信した提案、日付、値、およびその他の情報) に関するすべての情報を表示します。 このウィンドウは、提案の要求の作成者のみが使用します。

永続化ファイル

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

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

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

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

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

Web クライアント オプション

  • 新しい RFP の作成: 提案の新しい要求 (RFP) を作成し、購買プロセス ワークフローを開始します。

  • 更新: メイン ウィンドウでアクティブな RFP と完了した RFP の一覧を更新します。

  • 表示: 既存の RFP の内容を表示します。 ベンダーは、提案を送信できます (招待された場合、または RFP が完了していない場合)。

  • 表示: ユーザーは、アクティブな RFP グリッドの [ ビューとして表示 ] コンボ ボックスで目的の参加者を選択することで、異なる ID を使用して RFP にアクセスできます。

WinForms クライアント オプション

  • RFP の作成: 提案の新しい要求 (RFP) を作成し、購買プロセス ワークフローを開始します。

  • 更新: メイン ウィンドウでアクティブな RFP と完了した RFP の一覧を更新します。

  • RFP の表示: 既存の RFP の内容を表示します。 ベンダーは提案を送信できます (招待された場合、または RFP が完了していない場合)

  • 接続: ユーザーは、アクティブな RFP グリッドの [ ビューとして表示 ] コンボ ボックスで目的の参加者を選択することで、異なる ID を使用して RFP にアクセスできます。