ステートマシン ワークフロー サンプル
では、実際にサンプルを実装しながら、ステートマシン ワークフロー、特にデータ交換サービスの使い方を見ていきましょう。
プロジェクト作成
今回のサンプルは2つのプロジェクトで構成します。
プロジェクト名 | 概要 |
StateMachineWorkflowLibrary | ステートマシン ワークフローの定義を行うプロジェクト |
StateMachineWorkflowSampleApplication | 注文管理UIを提供するWindows Formsアプリケーション。StateMachineWorkflowLibraryのワークフローを読み込んで実行する |
Visual Studio 2005から新しいプロジェクトを作成します。まず最初にStateMachineWorkflowLibraryプロジェクトを作成しましょう。[プロジェクトの種類]として[Workflow]-[ステートマシンのワークフロー ライブラリ]を選んでください。
テンプレート名 | 概要 |
シーケンシャル ワークフロー コンソール アプリケーション | シーケンシャル ワークフローとホスティング用のコンソール アプリケーションを構築するプロジェクト |
シーケンシャル ワークフロー ライブラリ | 他のプロジェクトからシーケンシャル ワークフローを参照するためのライブラリを構築するプロジェクト |
ワークフロー アクティビティ ライブラリ | 他のプロジェクトからカスタム アクティビティを参照するためのライブラリを構築するプロジェクト |
ステートマシンのワークフロー コンソール アプリケーション | ステートマシン ワークフローとホスティング用のコンソール アプリケーションを構築するプロジェクト |
ステートマシンのワークフローライブラリ | 他のプロジェクトからステートマシン ワークフローを参照するためのライブラリを構築するプロジェクト |
空のワークフロー プロジェクト | ワークフローおよびアクティビティを作成するための空のプロジェクト |
ファイル名 | 概要 |
Workflow1.cs | ワークフロークラスファイル |
Workflow1.designer.cs | Visual Studioがワークフロー上に配置したコントロールの関係などを記録するためのファイル。Workflow1.csの部分クラス |
同様に、StateMachineWorkflowSampleApplicationプロジェクトも作成します。こちらは[プロジェクトの種類]として[Windows]-[Windows アプリケーション]を選んでください。
ファイル名 | 概要 |
Form1.cs | 注文管理アプリケーションUI。Windows Forms |
Program.cs | アプリケーション エントリポイント |
注文管理アプリケーションUI
StateMachineWorkflowSampleApplicationプロジェクトに注文管理アプリケーションUIを作成します。
ボタンコントロールとコンボボックスコントロールを以下のように配置します。WFとは直接関係ない部分ですので、詳細は省略します。
ユーザーに提供する機能は以下の通りです。
- [商品注文]ボタンを押すと商品の注文を行い、下のコンボボックスに注文IDを表示する。内部的にはワークフローを開始し、注文完了状態になる
- コンボボックスで注文IDを選択し、[指定商品発送]ボタンを押すと発送処理し、コンボボックスから注文を削除する。内部的には発送イベントを指定したワークフローに送出し、終了状態である発送完了状態になる
後ほど必要なイベントハンドラを記述しましょう。
データ交換サービスで使用するインターフェースの定義
データ交換サービスで使用するインターフェースを定義します。以降のコードはStateMachineWorkflowLibraryプロジェクトの「Workflow1.cs」に記述します。
今回はホスティングアプリケーションとワークフローの間での情報のやり取りのため、
- 発送イベント(ホスティングアプリケーション -> ワークフロー)
- 状態更新メソッド(ワークフロー -> ホスティングアプリケーション)
の2つをインターフェースとして定義します。
ホスティングアプリケーション上の操作([指定商品発送]ボタン押下)に対してワークフローに発送イベントを発行し、ワークフローの処理が進んだ時点でホスティングアプリケーションに状態更新メソッドを介してワークフローの状態を通知する、という流れになります。
データ交換サービスで使用するインターフェースは、以下のようにExternalDataExchange
属性を付加したC#のインターフェースとして定義します。System.Workflow.Activities.ExternalDataExchange
属性は、このインターフェースがデータ交換サービスを介して情報をやり取りするためのものであることを指定する属性です。
[ExternalDataExchange] public interface IOrderService { //発送イベント event EventHandler<OrderEventArgs> OrderShipped; //状態更新メソッド void ItemStatusUpdate(Guid orderId, string message); }
イベントに渡す引数はExternalDataEventArgsクラスを継承して定義します。System.Workflow.Activities.ExternalDataEventArgsクラスは、ワークフローに渡すイベントのパラメータを表すクラスです。ホスティングアプリケーションからワークフローに渡すパラメータはこのクラスを介して渡すことになります。今回は特に独自のフィールドは追加していません。
なお、コンストラクタ中のinstanceId
という引数は、ワークフローごとにWFから割り当てられたインスタンスIDを指しています。WFではこのインスタンスIDを使って、複数のワークフローの中から、イベントを送信するワークフローを指定します。
[Serializable] public class OrderEventArgs : ExternalDataEventArgs { public OrderEventArgs(Guid instanceId) : base(instanceId) { } }