n階層システム設計の考慮点

第6回 WCFとWFを統合したアプリケーションの設計について

この記事を読むのに必要な時間:およそ 4.5 分

③ WCFとWFを統合したアプリケーションの設計手順

WCFとWFを統合したアプリケーションを設計する場合,まず,WFを用いて業務の流れを考え,設計することから始めます。ここで,WCFのことも一緒に考えだすと混乱が生じることが多いため,まずは業務の流れからWFを設計することに専念したほうがよいでしょう。

対象業務の流れの把握

まずは業務の流れを把握することから始めます。これには一般的にはビジネスフローダイアグラムやビジネスワークフォローなどが用いられます。

最初はできるだけ細かい単位で作成します。慣れてきたらそれぞれのビジネスフローダイアグラムやビジネスワークフォロー間の接続や連携,実行順等の制御の必要性などが分かってくると思われます。

これにより,業務の流れが整理され,どの部分をWFで実現すればよいか明確化できます。

これができたら,WFで実現する部分のシナリオを作成します。シナリオを作成することで,WF内で実行すべきロジック,条件分枝や扱うデータなどが明確化されます。

WFの適用検討

シナリオができたらWFでの設計を検討します。その際,シーケンシャルワークフローかステートマシンワークフローを使用するか,選択することとなります。

この2種類の選択基準は以下のようになります。

シーケンシャルワークフロー

比較的単純な業務の流れで,処理が継続的に流れていく場合。ただし,処理は必ず処理開始から処理終了まで流れる。

一般的にワークフローで実現できる場合が多い。

図3 シーケンシャル・ワークフローの例

図3 シーケンシャル・ワークフローの例
ステートマシンワークフロー

イベントにより呼び出され,状態が変化していく。状態は必ず初期状態から始まり,最終状態で終わる。状態の遷移までには時間がかかることもある。

一般的にワークフローではなく,状態遷移図で設計する。

図4 ステートマシンワークフローの例

図4 ステートマシンワークフローの例

どちらのワークフローを使用するか選択し決定したら,シナリオをフローチャートや状態遷移図で記述します。

シーケンシャルワークフローを選択しワークフローを書き始めたが,作成している途中で以下の点で悩んだり作業が滞った場合,その部分だけでも状態遷移図を書いてみてください。それですんなりいく場合はその部分だけでもステートマシンワークフローを採用するほうがいいかもしれません。

その場合はアプリケーションを分けてそれぞれを連携させる方式にしたほうがよいでしょう。

WFの設計

今回のWFの設計時にはWCFと連携していることを意識して設計する必要がります。

それは通常のWFの設計であれば,プレゼンテーションレイヤ,サービスインターフェイスやビジネスコンポーネントからの呼び出しでインスタンス化され実行されます。しかし,WCFと連携する場合はWCFから呼び出されることがあります。そのため,ワークフローはどの状態にあっても再利用されることを意識した設計をする必要があります。つまり,各アクティビティ内で初期化処理,終了処理を必ず実装します。

また,このようなサービスを設計する場合にはサービスホストの作成時にアクティブになる拡張クラスを用います。拡張クラスはワークフローランタイムのグローバルインスタンスの作成および管理をします。これにより,独立して生成されるサービスインスタンスはこのグローバルインスタンスにアクセスできるようになります。

ただし,以下の点に注意して設計する必要があります。

異なるクライアントから同じワークフローインスタンスを呼ばない

グローバルインスタンス化されたワークフローは,さまざまなクライアントから呼び出すことができます。しかし,既に呼ばれているインスタンスを別のクライアントから呼び出されるとエラーが返されることになります。これは既に呼び出されているクライアントからのバインディング時にユニークなGUIDが生成され,保持されています。そのため,別のクライアントから呼び出された時にこのGUIDの不一致によりエラーが発生してしまいます。

持続ワークフローサービスを利用してネットワーク共有から異なるクライアントでステータスが同じワークフローインスタンス呼ばない

これも同様に既に呼び出しているクライアントとのGUIDの不一致によりエラーが発生してしまいます。

WCFの設計

WFと連携してサービスとして公開する場合,WCFのサービスコントラクトにはビジネスロジックは記述しません。その代わり,ビジネスロジックをカプセル化したWFで作成されたワークフローを呼び出すイベント制御,管理するコードを実装するための設計を行います。その際,グローバルインスタンス化するワークフローランタイムの呼び出し,初期化も含めて設計します。

データコントレクトにはワークフローとデータをやり取りするためのデータを設計します。この際,ワークフローが複数のデータをパラメータとしてやり取りする場合,これらを一つのクラスとして扱えるようにラッピングします。

また,呼び出したワークフローからの応答を待つように設計する必要があります。厳密にワークフローと同期をとる必要がある場合は,ワークフローの実行スケジュールを手動で設定できる方法を検討します。

これによりWCFを経由してWFのワークフローがサービスとして公開されることになります。こうして公開されたサービスは,通常のWCFで公開されたサービスとなんら変わることなく呼び出すことができます。

その他のアドレス,バインディングについては通常のWCFと同じように設計します。

著者プロフィール

露木敏博(つゆきとしひろ)

1966年神奈川県横浜市生まれ。1990年,株式会社日立システムアンドサービス(旧日立システムエンジニアリング株式会社)に入社。

流通系SE,営業所駐在SEなどを経て,2003年から生産技術部門で.NET技術に関する技術支援業務に携り,.NET技術に関する各種基準書および標準化,設計ガイドなどを作成。

マイクロソフトMVPアワードプログラムよりDevelopment Platforms - ASP/ASP.NETのカテゴリで2008年7月よりMVPアワードを受賞。