フォワード チェーン コントロール
フォワード チェーンは、個々のルールを組み合わせてルール セットを作成できるようにする非常に便利な概念です。ルール間の依存関係を定義する必要はなく、依存関係を知っておく必要もありません。ただし、場合によって、ルール作成者は、チェーンの動作をさらに細かく制御する機能 (具体的には、発生するチェーンを制限する機能) を使用できます。ルール作成者は、この機能を使用して以下を行うことができます。
不適切な結果を生じる可能性のある、ルールの繰り返し実行を制限する。
パフォーマンスを向上させる。
ランナウェイ ループを防ぐ。
Windows Workflow Foundation には、このような制御を容易にする次のような 2 つの便利なプロパティがあります。
RuleSet に対する ChainingBehavior プロパティ。
それぞれの Rule に対する ReevaluationBehavior プロパティ。
このどちらの値も、RuleSet エディタで設定できます。
ChainingBehavior プロパティ
RuleSet オブジェクトに対する ChainingBehavior プロパティの値は、Full、UpdateOnly、または None に設定できます。
既定のオプションである Full は、ここまで述べたような動作をすべて提供します。
UpdateOnly オプションは暗黙的な、属性に基づくチェーンを無効にして、明示的な Update ステートメントに関してのみチェーンを発生させるよう指示します。これにより、どのルールで再評価を実行するかを完全に制御できます。通常、これを使用するのは、過剰なルール再実行 (またはランナウェイ) の原因となる循環的な依存関係を防ぎたい場合や、RuleSet が完全に機能するうえで不必要なルール再評価を防いでパフォーマンスを向上させたい場合です。
最後のオプションは None です。このオプションを使用すると、エンジンは厳密に直線的にルールを評価します。各ルールは、優先順位に従って一度だけ評価されます。優先度のより高いルールは優先度の低いルールに影響を与える可能性がありますが、その逆はチェーンが発生しないため、起こりません。したがって、このオプションを使用するのは、ルール間に依存関係が存在せず、優先度を明示的に割り当てるような場合です。
ReevaluationBehavior プロパティ
Rule オブジェクトに対する ReevaluationBehavior プロパティの値として、Always または Never が可能です。
Always は既定で、先ほど述べたような動作を提供します。つまり、他のルールのアクションによって生じたチェーンに基づき、ルールが常に再評価されます。
Never は、その名のとおり、このような再評価を無効にします。ルールは一度だけ評価されます。既に何らかのアクションを実行済みの場合は、ルールは再評価されません。つまり、ルールが既に評価され、その結果として Then または Else アクションが実行された場合、そのルールは再評価されません。ただし、Then または Else アクション内の空のアクション コレクションを実行した場合は、ルールは実行済みとは見なされません。
通常、このプロパティを使用するのは、そのルールの自身のアクションまたは他のルールに対する依存関係が原因で無限ループが発生することをルール レベルで防ぎたい場合です。たとえば、次のようなルールでは自己的な無限ループが発生する可能性があり、ルールが機能するうえで再評価は不必要です。
IF this.shippingCharge < 2.5 AND this.orderValue > 100
THEN this.shippingCharge = 0
または、OrderValue フィールドが変更されたときに限りルールを再評価することを想定している場合、RuleSet に対してチェーン動作を設定し、明示的な Update ステートメントでだけチェーンを発生させることができます (その後、これらの Update ステートメントを関連するルール アクションに追加できます)。もちろん、ShippingCost の値が 0 でないことを検査する述語を既にこのルールに追加している可能性もあります。しかし、チェーン コントロールを使用すれば、ビジネス上の要件の代わりに評価の詳細に基づいてルールを定義する必要がなくなります。
Halt 関数
最後のコントロールである Halt 関数は、ルール アクションとして追加されます (エディタの Then または Else アクション ボックスに「Halt」と入力します)。これにより、RuleSet の実行が直ちに停止して、呼び出し元コードに制御が戻ります。もちろん、この関数が役立つのは、チェーン コントロールの場合だけではありません。たとえば、特定の動作を最終目標とする RuleSet で、その目標が達成されたときに実行を短縮するために Halt 関数を使用できます。
関連項目
参照
ChainingBehavior
ReevaluationBehavior
RuleHaltAction
RuleUpdateAction
RuleSet
概念
ワークフロー内での RuleSet の使用
RuleSet 内のルール評価
Copyright © 2007 by Microsoft Corporation.All rights reserved.