次の方法で共有


方法 : ワークフローでルール条件を使用する

アクティビティの実行動作を決定するには、条件を使用します。たとえば、ある IfElseBranchActivity を実行するかどうかを決定します。条件は、CodeCondition として指定できます。これには、トピック「方法 : コードを通して条件を使用する」で示すように、分離コードでの構成済みハンドラがあります。または、RuleConditionReference として条件を指定できます。RuleConditionReference は、ワークフロー プロジェクトにあるワークフローと関連付けられている .rules ファイル内の RuleCondition 定義を指します。条件をサポートするアクティビティでは、コード条件の代わりにルール条件を使用できます。

開発者にとって、コード条件の代わりにルール条件を使用する主な理由は、ルール条件がモデルの一部となるため、ワークフロー インスタンスを実行する際、実行時に動的に更新できるということです。ルール条件がモデルの一部となることの 2 番目の利点は、そのモデルに基づいてさらに高度なツールを構築し、追加の作成機能や依存関係の管理、複数条件での分析などを提供できることにあります。

アクティビティ条件へのルールの割り当て

アクティビティ条件にルールを使用するには、拡張子が .rules のファイルを作成します。このファイルは、埋め込みリソースとしてアセンブリにコンパイルする必要があります。CustomerHasCouponsCondition という名前の単一のルール条件を含む .rules ファイルを次の例に示します。このルールは、CustomHasCoupons という名前の対応するワークフロー プロパティが true を戻す場合に true と評価されます。

<RuleDefinitions xmlns="https://schemas.microsoft.com/winfx/2006/xaml/workflow">
  <RuleDefinitions.Conditions>
    <RuleExpressionCondition Name="CustomerHasCouponsCondition">
      <RuleExpressionCondition.Expression>
        <ns0:CodeBinaryOperatorExpression Operator="ValueEquality" xmlns:ns0="clr-namespace:System.CodeDom;Assembly=System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
          <ns0:CodeBinaryOperatorExpression.Left>
            <ns0:CodePropertyReferenceExpression PropertyName="CustomerHasCoupons">
              <ns0:CodePropertyReferenceExpression.TargetObject>
                <ns0:CodeThisReferenceExpression />
              </ns0:CodePropertyReferenceExpression.TargetObject>
            </ns0:CodePropertyReferenceExpression>
          </ns0:CodeBinaryOperatorExpression.Left>
          <ns0:CodeBinaryOperatorExpression.Right>
            <ns0:CodePrimitiveExpression>
              <ns0:CodePrimitiveExpression.Value>
                <ns1:Boolean xmlns:ns1="clr-namespace:System;Assembly=mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">true</ns1:Boolean>
              </ns0:CodePrimitiveExpression.Value>
            </ns0:CodePrimitiveExpression>
          </ns0:CodeBinaryOperatorExpression.Right>
        </ns0:CodeBinaryOperatorExpression>
      </RuleExpressionCondition.Expression>
    </RuleExpressionCondition>
  </RuleDefinitions.Conditions>
</RuleDefinitions>

アクティビティに対してルール条件を使用するには、新しい RuleConditionReference を作成します。ConditionName プロパティは、.rules ファイル内の RuleExpressionCondition 要素の Name 属性と同じ値に設定します。前に示されている例で、ルールの Name は CustomerHasCouponsCondition です。RuleConditionReference をアクティビティに対する条件と関連付けるには、Condition プロパティを、作成した RuleConditionReference と同じに設定します。

次のワークフロー定義では、IfElseActivity でルール条件を使用する方法を示します。以前に作成された .rules ファイルは、ワークフロー内で CustomerHasCoupons プロパティの値を使用して、条件を評価します。InitializeComponent メソッドで、RuleConditionReference が作成されて、IfElseActivityCondition プロパティに割り当てられます。

using System;
using System.ComponentModel;
using System.ComponentModel.Design;
using System.Collections;
using System.Drawing;
using System.Workflow.ComponentModel.Compiler;
using System.Workflow.ComponentModel.Serialization;
using System.Workflow.ComponentModel;
using System.Workflow.ComponentModel.Design;
using System.Workflow.Runtime;
using System.Workflow.Activities;
using System.Workflow.Activities.Rules;

namespace CustomerCouponApplication
{
    public sealed partial class CouponsWorkflow: SequentialWorkflowActivity
    {
        private bool customerHasCoupons = false;

        private IfElseBranchActivity elseHasCoupons;
        private IfElseBranchActivity ifHasCoupons;
        private IfElseActivity checkForCouponsActivity;

        public bool CustomerHasCoupons
        {
            get { return customerHasCoupons; }
            set { customerHasCoupons = value; }
        }

        public CouponsWorkflow()
        {
            InitializeComponent();
        }

        [System.Diagnostics.DebuggerNonUserCode]
        private void InitializeComponent()
        {
            this.CanModifyActivities = true;
            
            System.Workflow.Activities.Rules.RuleConditionReference hasCouponsCondition = new System.Workflow.Activities.Rules.RuleConditionReference();
            this.elseHasCoupons = new System.Workflow.Activities.IfElseBranchActivity();
            this.ifHasCoupons = new System.Workflow.Activities.IfElseBranchActivity();
            this.checkForCouponsActivity = new System.Workflow.Activities.IfElseActivity();

            // 
            // ifHasCoupons
            // 
            hasCouponsCondition.ConditionName = "CustomerHasCouponsCondition";
            this.ifHasCoupons.Condition = hasCouponsCondition;
            this.ifHasCoupons.Name = "ifElseBranchActivity1";
            // 
            // elseHasCoupons
            // 
            this.elseHasCoupons.Name = "ifElseBranchActivity2";
            // 
            // checkForCouponsActivity
            // 
            this.checkForCouponsActivity.Activities.Add(this.ifHasCoupons);
            this.checkForCouponsActivity.Activities.Add(this.elseHasCoupons);
            this.checkForCouponsActivity.Name = "ifCustomerHasCouponsActivity";
            // 
            // Workflow1
            // 
            this.Activities.Add(this.checkForCouponsActivity);
            this.Name = "CouponsWorkflow";
            this.CanModifyActivities = false;
        }
    }
}

関連項目

参照

RuleConditionReference
RuleCondition
CodeCondition
ConditionName

概念

方法 : コードを通して条件を使用する
ルール条件ワークフローの変更
Windows Workflow Foundation でサポートされている CodeDOM 型
ワークフロー内での RuleSet の使用
IfElseActivity アクティビティの使用
WhileActivity アクティビティの使用
ReplicatorActivity アクティビティの使用
ConditionedActivityGroup アクティビティの使用

その他の技術情報

チュートリアル : ルールと条件の使用

Footer image

Copyright © 2007 by Microsoft Corporation.All rights reserved.