永続化サービスの動作確認
では、アプリケーションを実行してみましょう。
ワークフローの実行に対応してイベントが発生していきます。イベントごとにダイアログが表示されるので、順を追って確認しましょう。
![アプリケーション初期状態 アプリケーション初期状態](http://cz-cdn.shoeisha.jp/static/images/article/1705/Test01.gif)
[商品注文]ボタンを押下すると、ワークフローが起動して処理が行われ、その後にアイドル状態に変化します。
![WorkflowIdledイベント発生 WorkflowIdledイベント発生](http://cz-cdn.shoeisha.jp/static/images/article/1705/Test02.gif)
続いて、ワークフローがアイドル状態になったことを検知した永続化サービスが、ワークフローを永続化します。
![WorkflowPersistedイベント発生 WorkflowPersistedイベント発生](http://cz-cdn.shoeisha.jp/static/images/article/1705/Test03.gif)
永続化させたため、メモリ上に不要となったワークフローがアンロードされます。
![WorkflowUnloadedイベント発生 WorkflowUnloadedイベント発生](http://cz-cdn.shoeisha.jp/static/images/article/1705/Test04.gif)
では、[指定商品発送]ボタンを押下し、ワークフローにイベントを与えて処理を再開させましょう。永続化したワークフローへのイベント送出を検知した永続化サービスがワークフローをメモリからロードします。
![WorkflowLoadedイベント発生 WorkflowLoadedイベント発生](http://cz-cdn.shoeisha.jp/static/images/article/1705/Test05.gif)
ロードしたワークフローの処理が行われ、ワークフローからホスティングアプリケーション側のメソッドが呼ばれ、ダイアログが表示されます。これは中編で実装したもので、永続化サービスとは無関係です。
!["発送完了"ダイアログ "発送完了"ダイアログ](http://cz-cdn.shoeisha.jp/static/images/article/1705/Test06.gif)
ワークフローは完了状態に到達しますが、完了する前に再び永続化が行われます(前項の、ワークフローが永続化されるタイミング、を参照してください)。
![WorkflowPersistedイベント発生 WorkflowPersistedイベント発生](http://cz-cdn.shoeisha.jp/static/images/article/1705/Test07.gif)
最後に、ワークフローが完了状態となります。
![WorkflowCompletedイベント発生 WorkflowCompletedイベント発生](http://cz-cdn.shoeisha.jp/static/images/article/1705/Test08.gif)
(ダイアログ表示を除き)表面上は前回のアプリケーションと同じ挙動をしていますが、実際にはどのように永続化されているのでしょうか。
永続化直後、つまりWorkflowPersistedイベント発生直後のデータベースを見てみましょう。永続化されたデータはInstanceStateテーブルに保存されています。
uidInstanceIDフィールドに、ワークフローのインスタンスIDが格納され、stateフィールドに、ワークフローをバイナリ化したデータが格納されています。
ワークフロー完了後、つまりWorkflowCompletedイベント発生後のデータベースを見てみましょう。
ワークフロー完了時には永続化されたデータは削除されています。
永続化サービスの追加により、ワークフローの永続化・ロードが自動的に行われることを確認できました。
永続化サービスの活用
ここまで見てきたとおり、WFの永続化サービスの組み込みは非常に容易です。ワークフロー側に永続化のための特別な設定をする必要はなく、またホスティングアプリケーション側で永続化のためのさまざまなコードが必要になるわけではありません。SQL Serverへの接続文字列を指定して永続化サービスを生成し、ワークフローランタイムに登録する、ただそれだけで永続化サービスの恩恵を受けることができます。
例えばワークフローの各イベントをWebサービス経由で受け取れるようにすれば、受注管理や稟議といったワークフローベースのアプリケーションを、サーバにホスティングしたWFで実現することができます。当然こういうケースでは、複数のワークフローがメモリ上に蓄積していきますので、永続化サービスを用いることになるでしょう。
今回使用したSqlWorkflowPersistenceService
クラスはSQL Serverにバイナリでワークフローを永続化しているため、永続化されたデータを直接アプリケーションで扱うのは容易ではありません。しかし、WorkflowPersistenceService
クラスを継承した、カスタム永続化サービスを実装すれば、ファイル保存やDBへの保存など、さまざまな仕方での永続化を実現できます。
WFの実用性を大いに高めてくれる永続化サービス、ぜひご活用ください。
シリーズまとめ
全…7回におよんだ.NET Framework 3.0入門シリーズも今回がついに最終回となりました。
何もかも手探り状態だったWPF記事から、原稿を重ねるうちに、もうVisual Studio 2008の足音が聞こえる時期になってきました。シリーズ執筆中に次のバージョンが出たらどうしよう、というのが執筆中の悩みでしたが、無事シリーズを完走することができました。
.NET Framework 3.0で導入されたWPF/WCF/WF(+WCS)は、それぞれ広い範囲に活用可能なコンポーネントです。最近世間を賑わしているMicrosoft社のRIA技術であるSilverlightも、よくご存じの通り、以前WPF/Eと呼ばれていた、(広義で言えば)WPFの関連技術です。
WCFは派手なフレームワークではありませんが、.NETベースで相互通信の必要なコンポーネントを作る際には非常に便利で、必須に近い技術かと思われます。
WFは、プログラマ全員が活用するタイプのフレームワークではありませんが、これまでに存在しなかった(=プログラマの発想にもあまり無かった)、無償・汎用のワークフローフレームワークですので、これからさまざまな活用方法が考えられていくでしょう。
まだ.NET Framework 3.0の新技術たちは十分に日の目を見ているわけではありませんが、Visual Studio 2008が本格的な仕切り直しとなり、アーリーアダプタからアーリーマジョリティへと普及が進んでいくと期待しています。
長きにわたるシリーズへのご支持、ご意見に深く感謝し、シリーズの結びといたします。ぜひ本シリーズを眺めながら、.NET Framework 3.0の新機能をご活用ください。
参考資料
- MSDN 『Windows Workflow Foundation ホスティングの紹介』
- 松崎 剛 ブログ 『WF(ワークフロー)を使ったWebページの画面遷移 : 実践編(Part 3)』
- 豆魂 『WFのホスティング』