はじめに
WFチュートリアル 前編ではWFの概要、そしてシーケンシャル ワークフローのサンプルについて解説しました。中編となる今回は、ステートマシン ワークフローのプログラミングモデルについて解説し、サンプルを作成します。
サンプルとしては、注文と発送だけを処理する簡易注文管理アプリケーションを考えます。状態遷移は以下の2つです。
- 商品を注文すると注文完了状態(発送待ち状態)に遷移する
- 商品を発送すると注文完了状態から発送完了状態に遷移し、終了する
ワークフロー的には以下のようになります。
実際のアプリケーションではステート数や遷移数がもっと多くなるかと思いますが、このサンプルで、
- Visual Studio 2005でのステートマシン ワークフローのデザイン
- ワークフロー内外のデータのやり取り
- 複数ワークフローのハンドリング
についてしっかり押さえておけば、多くのパターンに応用していけるでしょう。
対象読者
本記事はC#でのプログラミングを行ったことがある方を対象としています。サンプルを動作させるための環境設定等は「WPF(Windows Presentation Foundation)+XAML入門 前編」をご覧ください。
ステートマシン ワークフロー プログラミング
前回、「シーケンシャル ワークフロー」と「ステートマシン ワークフロー」の違いを説明しましたが、この違いはプログラミングモデルにも影響してきます。
シーケンシャル ワークフローとのプログラミングモデルの違い
シーケンシャル ワークフローはステートを持たないため、ホスティングするアプリケーションから実行させた後は、基本的にワークフロー側で処理が進みます。従って、最初にパラメータを渡してしまえば情報のやり取りはそれほど必要ありません。ワークフローを一旦実行すれば、後はワークフローに処理をお任せできる、投げっぱなしにできる場合も多いことでしょう。
しかし、ステートマシン ワークフローはイベントをトリガとして状態が変わっていくモデルですので、ワークフローを実行した後、ホスティングアプリケーションからイベントをワークフローに通知する必要があります。
また、比較的短時間で終わることの多いシーケンシャル ワークフローに対し、ステートマシン ワークフローはイベントが発生しない限り処理が進まないため、複数のワークフローをハンドリングする必要があります。こうした点も、シーケンシャル ワークフローとは異なる部分と言えます。シーケンシャル ワークフローでもホスティングアプリケーションからのイベントを待つことは可能ですが、1種類のイベントを受け付けるのが基本で、複数のイベントを待ち受けようとすると煩雑なワークフローとなってしまいます。ステートマシン ワークフローでは、複数のワークフローに対して、複数のイベントを同時に待ち受けることができますので、イベントドリブンのモデルをそのままワークフロー化することができます。
繰り返しとなりますが、ステートマシン ワークフローでは、
- ワークフロー内外のデータのやり取り
- 複数ワークフローでのイベントハンドリング
がポイントとなります。
データ交換サービス
ワークフローとホスティングアプリケーションの情報のやり取りのため、WFには「データ交換サービス」というサービスがあります。データ交換サービスはワークフローにイベントを発行し、ワークフローからホスティングアプリケーションを呼び出すためのメソッドを公開します。
実際には、C#のインターフェースとして情報をやり取りするためのイベント/メソッドを作成し、それをデータ交換サービスを介してワークフロー ランタイムに登録することになります。