为什么规则在对象的上下文中多次执行?

时间:2013-12-20 09:41:58

标签: workflow-foundation chaining rule-engine

有一个容器类,它有一个整数集合。我的目标是计算所有整数的总和。我在这里使用工作流规则引擎。编写的两条规则有点如下:

RuleName: Initializer
Priority: 2
Condition : 1==1
ThenActions: 
    this.i = 0;
ReEvaluationBehavior: Always

----

RuleName: Looping
Priority: 1
Condition: this.i < this.Items.Count
ThenActions:
    this.total = this.total + this.Items[this.i];
    this.i = this.i + 1;
ReEvaluationBehavior: Always

这只是一个抽象的表现形式。 Container类定义为:

public class NumberContainer
{
    public int i;
    public int ItemCount 
    {
        get
        {
            return this.Items.Length;
        }

        private double total;

        public double Total
        {
            get { return total; }
            set { total = value; }
        }

        private double[] items;

        public double[] Items
        {
            get { return items; }
            set { items = value; }
        }

        //Other stuff...
    }
}

我只在这里展示了重要的字段。所有这些(即填充的容器对象和规则集)都被送到规则引擎来执行。

为什么Looping规则执行多次而Initializer规则只执行一次?这与Chaining有关吗?事实是我们在i规则中设置Looping的值,并且相同的变量碰巧是相应规则条件的一部分吗?

1 个答案:

答案 0 :(得分:0)

通常,基于RETE的/正向链接规则引擎在其条件变为“新的真实”时执行规则。在此上下文中最新为真意味着条件为真,并且自上次检查条件以来其中一个输入变量已更改。

在您的情况下,第一个规则没有输入变量,因此只触发一次。第二条规则有两个输入变量this.ithis.Items.Count。首先触发后,第二个规则修改this.i,导致在触发规则后重新检查其条件。然后该条件再次重新出现(重复直到this.i>=this.Items.Count)。