はじめに
第5回、第7回に続き、.NET Framework 3.0から導入されたコンポーネントとVisual Studio 2008でのサポートについて解説していきます。
今回扱うのはワークフロー フレームワークであるWF(Windows Workflow Foundation)です。.NET Framework 3.5から、WFとWCFの統合が図られ、ワークフローをWCFの通信モデルを使って提供することが容易になりました。
対象読者
- Visual Studio 2008に興味がある方
- WFに興味がある方
必要な環境
シリーズ第1回を参考に、Visual Studio 2008のインストールを行ってください。
WFについて
.NET Framework 3.0から導入されたコンポーネント群について、Visual Studio 2008からどのように利用できるかを解説していますが、最後に残ったのがWF(Windows Workflow Foundation)です。
ワークフローとは何か
ワークフローとは、主に業務アプリケーションなどで使われることの多い言葉で、特定の業務を小さな処理(ワーク)の集合体でなる一つの流れ(フロー)とみなす概念のことです。
ワークフローの重要性について考える際に、ワークフロー自体をビジネスモデルと呼べる場合もある、というのは興味深いことです。例えば多くのオンラインショップで利用されている「買い物かご」あるいは「カート」モデルは、1つのワークフローと呼ぶことができます。
「商品を1つ注文したら精算する(都度精算モデル)」というワークフローから「商品を任意の数だけ注文し、最後に一括で精算する(買い物かごモデル)」というワークフローに移行することで、ユーザーエクスペリエンスの向上・さらなる購入機会の増大(「ついで買い」の可能性は都度精算モデルよりも買い物かごモデルの方が高いでしょう)など、多くのメリットが生み出されてきました。ワークフローが業務の単なる手順書にとどまらず、ビジネス全体に影響を及ぼす一例ではないでしょうか。
このように、どのような処理の組み合わせで流れていくかという観点で業務をモデル化したものがワークフローです。ワークフローの中の処理のことをアクティビティと呼びます。
ワークフローを専門に扱うフレームワークが必要なのはなぜか
「ワークフローとは、細かな処理であるアクティビティの組み合わせである」という概念が分かったならば、それをコンピュータ上に実装することは簡単でしょう。
しかし、シンプルなモデルであれば、プログラム実装およびワークフロー変更に伴う書き換えもそれほど煩雑ではないかもしれませんが、複雑な条件や多くの処理を含むワークフローの場合、モデルをプログラムに落とし込む中でバグが入り込むかもしれません。
ここでワークフロー フレームワークの登場です。ワークフロー フレームワークはワークフローをプログラムに落とし込まず、そのままのモデルで扱います。このことには多くのメリットがあります。
- 可視化:
- ドメイン固有言語(Domain-Specific Language:DSL)である:
- 再利用性:
今回扱うWFは、ワークフローを.NET Framework上で扱うために設計された、汎用的に使用可能なフレームワークです。
WFの扱うワークフロー
WFでは、大きく分けて2種類のワークフローを扱うことができます。
シーケンシャル ワークフロー
シーケンシャル ワークフローは、ワークフロー開始からアクティビティを実行していき、最後のアクティビティが完了するまで順に処理が流れていくワークフローです。
ただし、シーケンシャル ワークフローは厳密な逐次処理ではなく、複数のアクティビティを同時に実行することもできますので、処理の順番が厳密に定められているわけではありません。
ステートマシン ワークフロー
ステートマシン ワークフローは、さまざまな状態(ステート)を含んでおり、イベントに応じてステート間を遷移しながら処理を行い、最終状態に遷移していくワークフローです。
ステートマシン ワークフローはイベントをトリガにしてアクションを実行し、ステートを遷移しながら処理を行います。
こうした状態遷移を持つモデルを実装する場合、ステート管理が煩雑になりがちです。しかしWFにおいては、ステート管理やワークフローに伴うさまざまな処理をフレームワークに任せることができます。
2種類のワークフローの特徴
シーケンシャル ワークフローは、処理シーケンスをモデル化したもので、基本的に止まることなく処理が続いて流れていきます(もちろん、アクション内でブロックが発生して処理が止まることはあります)。
それに対し、ステートマシン ワークフローはステートを中心に、ステート間を繋ぐイベントとアクションをモデル化したもので、イベントがない限り処理は止まっており、イベントが発生した時点でアクションが実行されてステートが変化していきます。
実は、シーケンシャル ワークフローはステートマシン ワークフローの特殊なパターン(初期状態と終了状態以外のステートを持たないステートマシン ワークフロー)と言えます。従って、すべてのシーケンシャル ワークフローはステートマシン ワークフローとして表現することができます。
実装においては、扱う対象が特にステートを持たず、シーケンシャル ワークフローで表現できるものか、ステート・イベント・アクションの組み合わせで構成されるステートマシン ワークフローで表現する必要があるものか、を検討したうえで、よりモデル化しやすい方を選んでいきましょう。