ステートマシン ワークフローのデザイン
では、StateMachineWorkflowLibraryプロジェクトの「Workflow1.cs」を開き、ステートマシン ワークフローをデザインしていきましょう。
初期状態では「Workflow1InitialState」というStateアクティビティだけが配置されています。画面中に表示されているように、Stateアクティビティはその中に4種類のアクティビティを入れ子で持つことができます。
それぞれのアクティビティの概要は以下の通りです。
| アクティビティ | 説明 |
| State | 内部状態を表すアクティビティ |
| EventDriven | イベントを記述するためのアクティビティ |
| StateInitialization | 他の状態から遷移してきたときに行う処理を配置するためのアクティビティ |
| StateFinalization | 他の状態へ遷移するときに行う処理を配置するためのアクティビティ |
基本的な使い方ですが、他の状態への遷移の際にはEventDrivenアクティビティを配置し、その中で遷移のトリガとなるイベント、遷移先状態を設定します。それぞれの状態への入/出の際に特定の処理を行う場合はStateInitialization/StateFinalizationアクティビティで記述します。
次に、ホスティングアプリケーションからのイベントを受け取るため、ツールボックスからEventDrivenアクティビティをWorkflow1InitialStateにドラッグ&ドロップします。
EventDrivenアクティビティは外部からのイベントおよびDelayアクティビティによるタイムアウトイベントを受け付けるアクティビティです。
発送完了状態を表すStateアクティビティを配置し、名前をsecondStateActivityとします。
配置したEventDrivenアクティビティをダブルクリックし、画面をEventDrivenアクティビティの編集画面に切り替えます。
ツールボックスからHandleExternalEventアクティビティを、EventDrivenアクティビティ上にドラッグ&ドロップします。HandleExternalEventアクティビティはワークフロー外部から送出されるイベントをハンドルするためのアクティビティです。
配置したHandleExternalEventアクティビティのプロパティで、処理するイベントを指定します。ここでデータ交換サービスとして定義したインターフェースを指定することになります。
まず、InterfaceTypeプロパティの右の[...]ボタンから、インターフェースとしてStateMachineWorkflowLibrary.IOrderServiceを指定します。
次に、EventNameプロパティとしてドロップダウンから発送イベントであるOrderShippedを選択します。
パラメータとして受け取ったイベント引数を保存しておきましょう。[パラメータ]の下の「e」をダブルクリックすると、ワークフロー内の既存のメンバに保存するか、新しいメンバをフィールドを追加するかのダイアログが表示されます。今回は[新しいメンバへのバインド]を選択し、[OrderShippedEventArgs]という名前のプロパティを作成しましょう。
このプロパティは、後でホスティングアプリケーションのメソッドを呼び出すときに使用します。
イベントをハンドリングしたので、次の状態へと遷移します。SetStateアクティビティをHandleExternalEventアクティビティの下に追加します。SetStateアクティビティは状態を遷移させるアクティビティです。
TargetStateNameプロパティに、遷移先であるsecondStateActivityを選択します。

以上でEventDrivenアクティビティのデザインは完了です。左上の[Workflow1]をクリックすると、全体のデザイン画面に戻ります。SetStateアクティビティで遷移先を指定したので、Stateアクティビティ間に矢印が追加されていることに注目してください。
secondStateActivityをワークフローの終了状態としましょう。secondStateActivity上で右クリックし、コンテキストメニューから[完了済みの状態として設定]を選択してください。

secondStateActivityの左上に完了状態を表す赤いアイコンが付きます。なお、開始状態/完了状態はワークフローのInitialStateName/CompletedStateNameプロパティでそれぞれ指定されています。
発送完了通知処理
次に、発送が完了したことをホスティングアプリケーションに通知する処理を追加します。
ツールボックスからStateFinalizationアクティビティをWorkflow1InitialStateにドラッグ&ドロップします。StateFinalizationアクティビティは、先ほども解説したとおり、その状態から別の状態に遷移する際に呼び出されます。今回の場合はEventDrivenアクティビティ内のSetStateアクティビティで状態遷移する際に呼び出されます。
追加したStateFinalizationアクティビティをダブルクリックし、その中にCallExternalMethodアクティビティをドラッグ&ドロップします。CallExternalMethodアクティビティは外部のメソッドを呼び出すアクティビティです。
CallExternalMethodアクティビティのプロパティとして、呼び出すインターフェース/メソッドを指定します。HandleExternalEventアクティビティの場合と同様、StateMachineWorkflowLibrary.IOrderServiceインターフェースを指定し、MethodNameプロパティにはItemStatusUpdateを選択します。
ItemStatusUpdateメソッドのパラメータとしてinstanceIdをダブルクリックすると、既存のメンバを指定するか、新しいメンバを指定するかのダイアログが表示されるので、instanceIdパラメータには、HandleExternalEventアクティビティでイベントを保存しておいたOrderShippedEventArgsプロパティのInstanceIdフィールドを指定しましょう。
messageパラメータには"発送完了"という値を指定します。プロパティ内容は以下のようになります。
これで、ホスティングアプリケーションに対して、どのワークフローが発送完了になったかを通知することができます。
以上でステートマシン ワークフローのデザインは完了です。














