CodeZine(コードジン)

特集ページ一覧

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

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

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

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

目次

ステートマシン ワークフロー サンプル

 では、実際にサンプルを実装しながら、ステートマシン ワークフロー、特にデータ交換サービスの使い方を見ていきましょう。

プロジェクト作成

 今回のサンプルは2つのプロジェクトで構成します。

ステートマシン ワークフロー サンプル プロジェクト構成
プロジェクト名概要
StateMachineWorkflowLibraryステートマシン ワークフローの定義を行うプロジェクト
StateMachineWorkflowSampleApplication注文管理UIを提供するWindows Formsアプリケーション。StateMachineWorkflowLibraryのワークフローを読み込んで実行する

 Visual Studio 2005から新しいプロジェクトを作成します。まず最初にStateMachineWorkflowLibraryプロジェクトを作成しましょう。[プロジェクトの種類]として[Workflow]-[ステートマシンのワークフロー ライブラリ]を選んでください。

Visual Studio 2005 Extensions for WFで提供されるプロジェクトテンプレート
 Visual Studio 2005 Extensions for WFでは、WFで使用するためのプロジェクトテンプレートが提供されています。それぞれの概要を示します。
プロジェクトテンプレート一覧
テンプレート名概要
シーケンシャル ワークフロー コンソール アプリケーションシーケンシャル ワークフローとホスティング用のコンソール アプリケーションを構築するプロジェクト
シーケンシャル ワークフロー ライブラリ他のプロジェクトからシーケンシャル ワークフローを参照するためのライブラリを構築するプロジェクト
ワークフロー アクティビティ ライブラリ他のプロジェクトからカスタム アクティビティを参照するためのライブラリを構築するプロジェクト
ステートマシンのワークフロー コンソール アプリケーションステートマシン ワークフローとホスティング用のコンソール アプリケーションを構築するプロジェクト
ステートマシンのワークフローライブラリ他のプロジェクトからステートマシン ワークフローを参照するためのライブラリを構築するプロジェクト
空のワークフロー プロジェクトワークフローおよびアクティビティを作成するための空のプロジェクト
StateMachineWorkflowLibraryプロジェクトの作成
StateMachineWorkflowLibraryプロジェクトの作成
StateMachineWorkflowLibraryプロジェクト作成時に生成されるファイル
ファイル名概要
Workflow1.csワークフロークラスファイル
Workflow1.designer.csVisual Studioがワークフロー上に配置したコントロールの関係などを記録するためのファイル。Workflow1.csの部分クラス

 同様に、StateMachineWorkflowSampleApplicationプロジェクトも作成します。こちらは[プロジェクトの種類]として[Windows]-[Windows アプリケーション]を選んでください。

StateMachineWorkflowSampleApplication
StateMachineWorkflowSampleApplication
StateMachineWorkflowSampleApplicationプロジェクト作成時に生成されるファイル
ファイル名概要
Form1.cs注文管理アプリケーションUI。Windows Forms
Program.csアプリケーション エントリポイント

注文管理アプリケーションUI

 StateMachineWorkflowSampleApplicationプロジェクトに注文管理アプリケーションUIを作成します。

 ボタンコントロールとコンボボックスコントロールを以下のように配置します。WFとは直接関係ない部分ですので、詳細は省略します。

注文管理アプリケーションUI
注文管理アプリケーションUI

 ユーザーに提供する機能は以下の通りです。

  • [商品注文]ボタンを押すと商品の注文を行い、下のコンボボックスに注文IDを表示する。内部的にはワークフローを開始し、注文完了状態になる
  • コンボボックスで注文IDを選択し、[指定商品発送]ボタンを押すと発送処理し、コンボボックスから注文を削除する。内部的には発送イベントを指定したワークフローに送出し、終了状態である発送完了状態になる

 後ほど必要なイベントハンドラを記述しましょう。

データ交換サービスで使用するインターフェースの定義

 データ交換サービスで使用するインターフェースを定義します。以降のコードはStateMachineWorkflowLibraryプロジェクトの「Workflow1.cs」に記述します。

 今回はホスティングアプリケーションとワークフローの間での情報のやり取りのため、

  • 発送イベント(ホスティングアプリケーション -> ワークフロー)
  • 状態更新メソッド(ワークフロー -> ホスティングアプリケーション)

 の2つをインターフェースとして定義します。

 ホスティングアプリケーション上の操作([指定商品発送]ボタン押下)に対してワークフローに発送イベントを発行し、ワークフローの処理が進んだ時点でホスティングアプリケーションに状態更新メソッドを介してワークフローの状態を通知する、という流れになります。

 データ交換サービスで使用するインターフェースは、以下のようにExternalDataExchange属性を付加したC#のインターフェースとして定義します。System.Workflow.Activities.ExternalDataExchange属性は、このインターフェースがデータ交換サービスを介して情報をやり取りするためのものであることを指定する属性です。

データ交換サービスで使用するインターフェースの定義
[ExternalDataExchange]
public interface IOrderService
{
  //発送イベント
  event EventHandler<OrderEventArgs> OrderShipped; 

  //状態更新メソッド
  void ItemStatusUpdate(Guid orderId, string message); 
}

 イベントに渡す引数はExternalDataEventArgsクラスを継承して定義します。System.Workflow.Activities.ExternalDataEventArgsクラスは、ワークフローに渡すイベントのパラメータを表すクラスです。ホスティングアプリケーションからワークフローに渡すパラメータはこのクラスを介して渡すことになります。今回は特に独自のフィールドは追加していません。

 なお、コンストラクタ中のinstanceIdという引数は、ワークフローごとにWFから割り当てられたインスタンスIDを指しています。WFではこのインスタンスIDを使って、複数のワークフローの中から、イベントを送信するワークフローを指定します。

データ交換サービスで使用するイベント引数の定義
[Serializable]
public class OrderEventArgs : ExternalDataEventArgs
{
  public OrderEventArgs(Guid instanceId) : base(instanceId)
  {
  }
}

  • 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