方法 : ワークフローでルール条件を使用する
アクティビティの実行動作を決定するには、条件を使用します。たとえば、ある 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 が作成されて、IfElseActivity の Condition プロパティに割り当てられます。
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 アクティビティの使用
その他の技術情報
Copyright © 2007 by Microsoft Corporation.All rights reserved.