有一个容器类,它有一个整数集合。我的目标是计算所有整数的总和。我在这里使用工作流规则引擎。编写的两条规则有点如下:
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
的值,并且相同的变量碰巧是相应规则条件的一部分吗?
答案 0 :(得分:0)
通常,基于RETE的/正向链接规则引擎在其条件变为“新的真实”时执行规则。在此上下文中最新为真意味着条件为真,并且自上次检查条件以来其中一个输入变量已更改。
在您的情况下,第一个规则没有输入变量,因此只触发一次。第二条规则有两个输入变量this.i
和this.Items.Count
。首先触发后,第二个规则修改this.i
,导致在触发规则后重新检查其条件。然后该条件再次重新出现(重复直到this.i>=this.Items.Count
)。