SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

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

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

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


  • X ポスト
  • このエントリーをはてなブックマークに追加

第二歩~IfElseアクティビティ

 では次に、IfElseアクティビティを使って条件分岐を行ってみましょう。

 IfElseアクティビティは条件としてソースコードを指定することもできますが、ルール条件を指定して分岐を行うこともできます。

 最初に上げた購入申請のフローの一部を作ってみましょう。ワークフロー外部からワークフローに情報を渡す必要がありますので、その受け渡しについても確認しましょう。

 以下の手順で作業を進めます。

  • 申請情報・申請者情報をワークフロー外部で定義する
  • 申請クラスのインスタンスをワークフローに渡す
  • ワークフロー内で、外部から渡された申請インスタンスに対して条件判断をする

 まず、申請クラスと申請者クラスを「Program.cs」内に次のように定義します。

 申請クラスは申請者・今回の申請額を、申請者クラスは名前とその人が上長承認無しに決裁可能な裁量金額を持ちます。

Application、Employeeクラス
//申請クラス
public class Application
{
  //申請者
  private Employee applicant;
  //申請額
  private int price;

  public Employee Applicant
    {
      get { return applicant; }
      set { applicant = value; }
    }

  public int Price
    {
      get { return price; }
      set { price = value; }
    }
}

//社員クラス
public class Employee
{
  //申請者氏名
  private String name;
  //裁量金額
  private int maxPrice;

  public String Name
    {
      get { return name; }
      set { name = value; }
    }

  public int MaxPrice
    {
      get { return maxPrice; }
      set { maxPrice = value; }
    }
}

 次に、ワークフローにこの申請インスタンスを受け取るためのプロパティを追加します。「Workflo1.cs」に以下のコードを追加します。

Workflow1.cs 申請プロパティ
private Application applicationParameter;

public Application ApplicationParameter
{
  get { return applicationParameter; }
  set { applicationParameter = value; }
}

 ワークフロー実行時にApplicationインスタンスを渡すようにしましょう。「Program.cs」のMainメソッドを次のように書き換えます。

Mainメソッド ワークフロー起動部分
//ワークフローに与えるDictionaryインスタンス
Dictionary<string, object> properties = new Dictionary<string, object>();
//申請者インスタンス
Employee person = new Employee();
person.Name = "Doi";
person.MaxPrice = 1000; //裁量金額は1000円まで

//申請インスタンス
Application application = new Application();
application.Applicant = person;
application.Price = 2000; //裁量以上の金額を申請

//Dictionaryに申請インスタンスを追加
properties.Add("ApplicationParameter", application);
//CreateWorkflow時にDictionaryインスタンスを指定
WorkflowInstance instance = workflowRuntime.CreateWorkflow(
    typeof(WFSequenceSample.Workflow1),properties);
instance.Start();

 このように、申請インスタンスをCreateWorkflowメソッドに渡すことで、ワークフローに対してパラメータを渡すことができます。ワークフロー側のプロパティ名と、CreateWorkflowに渡すDictionaryインスタンスに格納するキーが同じ"ApplicationParameter"であることに注目してください。こうすることでCreateWorkflowメソッドが自動的に同名のプロパティにインスタンスを紐づけてくれます。

 このように、WFでは、起動時のパラメータやWebサービスの取得結果などをプロパティで受け渡しします。

 では、Codeアクティビティを削除し、IfElseアクティビティをドラッグ&ドロップで配置しましょう。

IfElseアクティビティ配置
IfElseアクティビティ配置

 左下のifElseBranchActivity1をクリックし、プロパティペインの"Condition"を[宣言型のルール条件]に、"ConditionName"を"isUnderMaxPrice"に設定し、"Expression"に以下の条件を入れてください。

ルール条件
this.Application.Price > this.Application.Applicant.MaxPrice

 「Program.cs」から渡された申請インスタンスをプロパティから取得し、申請金額と裁量金額を比較する条件を入れています。この条件が真であればマネージャの決裁が必要、偽であればそのまま購入許可が出る、ということになります。

ルール条件の保存法法
 ここで設定したルール条件は、ソースコード中に保存されるのではなく、「Workflow1.rules」というファイルに保存されます。
 何の気無しにファイルの中身を覗いて思わず絶句。条件式がきちんとXML化されています。
XML化されたルール条件
<RuleExpressionCondition Name="isUnderMaxPrice">
  <RuleExpressionCondition.Expression>
    <ns0:CodeBinaryOperatorExpression Operator="GreaterThan"
      xmlns:ns0="clr-namespace:System.CodeDom;Assembly=System,
 Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
      <ns0:CodeBinaryOperatorExpression.Left>
        <ns0:CodePropertyReferenceExpression PropertyName="Price">
          <ns0:CodePropertyReferenceExpression.TargetObject>
            <ns0:CodePropertyReferenceExpression
              PropertyName="ApplicationParameter">
              <ns0:CodePropertyReferenceExpression.TargetObject>
                <ns0:CodeThisReferenceExpression />
              </ns0:CodePropertyReferenceExpression.TargetObject>
            </ns0:CodePropertyReferenceExpression>
          </ns0:CodePropertyReferenceExpression.TargetObject>
        </ns0:CodePropertyReferenceExpression>
      </ns0:CodeBinaryOperatorExpression.Left>
・・・省略・・・
 例えばOperator="GreaterThan"は条件式内の>を表しているのだと思われます。

 Codeアクティビティで分岐結果を書きましょう。Codeアクティビティを分岐の左下(上のルール条件が真の場合)と右下(偽の場合)にドラッグ&ドロップし、それぞれコードを書きます。

Codeアクティビティを2個配置
Codeアクティビティを2個配置
ルール条件真偽それぞれのコード
private void codeActivity1_ExecuteCode_1(object sender, EventArgs e)
{
  //ルール条件真の場合
  Console.WriteLine("要マネージャ決裁");
}
private void codeActivity2_ExecuteCode(object sender, EventArgs e)
{
  //ルール条件偽の場合
  Console.WriteLine("購入許可");
}

 [F5]キーを押して実行しましょう。

実行結果
実行結果

 社員の裁量金額を超えた申請のため、指定したルール条件が真となり(ワークフローが左側に流れ)、"要マネージャ決裁"というメッセージがコンソールに出力されるはずです。

 このように、IfElseアクティビティを使うことで条件分岐をコード内に埋め込んでしまうのではなく、プロパティとしてワークフロー内で設定できます。こうした条件による処理は、ConditionedActivityGroupアクティビティやWhileアクティビティでも使うケースですので、よく理解しておきましょう。

まとめ

 前編では、ワークフローの概要・WFの特徴・シーケンシャルワークフローのサンプルについて扱いました。また、ワークフローに必要な分岐処理や外部からのパラメータの渡し方などを説明しました。WFが提供しているさまざまなアクティビティを使うことで、業務に必要なワークフローを構築していくことができるでしょう。

 次回はステートマシンワークフローによるサンプルを取り上げます。シーケンシャルワークフローとは異なるモデルですので、また頭を切り換えて取り組みましょう。

 それでは、次回もお楽しみに。

参考資料

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
Vista時代のプログラミングモデル .NET Framework 3.0入門連載記事一覧

もっと読む

この記事の著者

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

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

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

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

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/1572 2007/09/20 16:09

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング