CodeZine(コードジン)

特集ページ一覧

WF(Windows Workflow Foundation)チュートリアル 中編

Vista時代のプログラミングモデル .NET Framework 3.0入門 (6)

  • LINEで送る
  • このエントリーをはてなブックマークに追加
2007/09/25 10:00

ダウンロード サンプルソース (19.0 KB)

目次

ステートマシン ワークフローのデザイン

 では、StateMachineWorkflowLibraryプロジェクトの「Workflow1.cs」を開き、ステートマシン ワークフローをデザインしていきましょう。

 初期状態では「Workflow1InitialState」というStateアクティビティだけが配置されています。画面中に表示されているように、Stateアクティビティはその中に4種類のアクティビティを入れ子で持つことができます。

初期状態
初期状態

 それぞれのアクティビティの概要は以下の通りです。

Stateアクティビティ内に配置できるアクティビティ
アクティビティ説明
State内部状態を表すアクティビティ
EventDrivenイベントを記述するためのアクティビティ
StateInitialization他の状態から遷移してきたときに行う処理を配置するためのアクティビティ
StateFinalization他の状態へ遷移するときに行う処理を配置するためのアクティビティ

 基本的な使い方ですが、他の状態への遷移の際にはEventDrivenアクティビティを配置し、その中で遷移のトリガとなるイベント、遷移先状態を設定します。それぞれの状態への入/出の際に特定の処理を行う場合はStateInitialization/StateFinalizationアクティビティで記述します。

 次に、ホスティングアプリケーションからのイベントを受け取るため、ツールボックスからEventDrivenアクティビティをWorkflow1InitialStateにドラッグ&ドロップします。

 EventDrivenアクティビティは外部からのイベントおよびDelayアクティビティによるタイムアウトイベントを受け付けるアクティビティです。

EventDrivenアクティビティ配置
EventDrivenアクティビティ配置

 発送完了状態を表すStateアクティビティを配置し、名前をsecondStateActivityとします。

発送完了状態追加
発送完了状態追加

 配置したEventDrivenアクティビティをダブルクリックし、画面をEventDrivenアクティビティの編集画面に切り替えます。

EventDrivenアクティビティの編集画面
EventDrivenアクティビティの編集画面

 ツールボックスからHandleExternalEventアクティビティを、EventDrivenアクティビティ上にドラッグ&ドロップします。HandleExternalEventアクティビティはワークフロー外部から送出されるイベントをハンドルするためのアクティビティです。

HandleExternalEventアクティビティの配置
HandleExternalEventアクティビティの配置

 配置したHandleExternalEventアクティビティのプロパティで、処理するイベントを指定します。ここでデータ交換サービスとして定義したインターフェースを指定することになります。

 まず、InterfaceTypeプロパティの右の[...]ボタンから、インターフェースとしてStateMachineWorkflowLibrary.IOrderServiceを指定します。

InterfaceTypeプロパティの選択
InterfaceTypeプロパティの選択

 次に、EventNameプロパティとしてドロップダウンから発送イベントであるOrderShippedを選択します。

EventNameプロパティ
EventNameプロパティ

 パラメータとして受け取ったイベント引数を保存しておきましょう。[パラメータ]の下の「e」をダブルクリックすると、ワークフロー内の既存のメンバに保存するか、新しいメンバをフィールドを追加するかのダイアログが表示されます。今回は[新しいメンバへのバインド]を選択し、[OrderShippedEventArgs]という名前のプロパティを作成しましょう。

 このプロパティは、後でホスティングアプリケーションのメソッドを呼び出すときに使用します。

イベント保存用プロパティの作成
イベント保存用プロパティの作成

 イベントをハンドリングしたので、次の状態へと遷移します。SetStateアクティビティをHandleExternalEventアクティビティの下に追加します。SetStateアクティビティは状態を遷移させるアクティビティです。

SetStateアクティビティ追加
SetStateアクティビティ追加

 TargetStateNameプロパティに、遷移先であるsecondStateActivityを選択します。

TargetStateNameプロパティ
TargetStateNameプロパティ

 以上でEventDrivenアクティビティのデザインは完了です。左上の[Workflow1]をクリックすると、全体のデザイン画面に戻ります。SetStateアクティビティで遷移先を指定したので、Stateアクティビティ間に矢印が追加されていることに注目してください。

State間遷移
State間遷移

 secondStateActivityをワークフローの終了状態としましょう。secondStateActivity上で右クリックし、コンテキストメニューから[完了済みの状態として設定]を選択してください。

完了済設定
完了済設定

 secondStateActivityの左上に完了状態を表す赤いアイコンが付きます。なお、開始状態/完了状態はワークフローのInitialStateName/CompletedStateNameプロパティでそれぞれ指定されています。

発送完了通知処理

 次に、発送が完了したことをホスティングアプリケーションに通知する処理を追加します。

 ツールボックスからStateFinalizationアクティビティをWorkflow1InitialStateにドラッグ&ドロップします。StateFinalizationアクティビティは、先ほども解説したとおり、その状態から別の状態に遷移する際に呼び出されます。今回の場合はEventDrivenアクティビティ内のSetStateアクティビティで状態遷移する際に呼び出されます。

 追加したStateFinalizationアクティビティをダブルクリックし、その中にCallExternalMethodアクティビティをドラッグ&ドロップします。CallExternalMethodアクティビティは外部のメソッドを呼び出すアクティビティです。

StateFinalizationアクティビティ内にCallExternalMethodアクティビティを配置
StateFinalizationアクティビティ内にCallExternalMethodアクティビティを配置

 CallExternalMethodアクティビティのプロパティとして、呼び出すインターフェース/メソッドを指定します。HandleExternalEventアクティビティの場合と同様、StateMachineWorkflowLibrary.IOrderServiceインターフェースを指定し、MethodNameプロパティにはItemStatusUpdateを選択します。

 ItemStatusUpdateメソッドのパラメータとしてinstanceIdをダブルクリックすると、既存のメンバを指定するか、新しいメンバを指定するかのダイアログが表示されるので、instanceIdパラメータには、HandleExternalEventアクティビティでイベントを保存しておいたOrderShippedEventArgsプロパティのInstanceIdフィールドを指定しましょう。

パラメータ指定
パラメータ指定

 messageパラメータには"発送完了"という値を指定します。プロパティ内容は以下のようになります。

CallExternalMethodアクティビティプロパティ
CallExternalMethodアクティビティプロパティ

 これで、ホスティングアプリケーションに対して、どのワークフローが発送完了になったかを通知することができます。

 以上でステートマシン ワークフローのデザインは完了です。

完成したワークフロー
完成したワークフロー

  • LINEで送る
  • このエントリーをはてなブックマークに追加

バックナンバー

連載:Vista時代のプログラミングモデル .NET Framework 3.0入門

著者プロフィール

  • WINGSプロジェクト 土井 毅(ドイ ツヨシ)

    <WINGSプロジェクトについて> 有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂...

  • 山田 祥寛(ヤマダ ヨシヒロ)

    静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for ASP/ASP.NET。執筆コミュニティ「WINGSプロジェクト」代表。 主な著書に「入門シリーズ(サーバサイドAjax/XM...

あなたにオススメ

All contents copyright © 2005-2021 Shoeisha Co., Ltd. All rights reserved. ver.1.5