http://www.cnblogs.com/linbc/archive/2008/06/19/1224373.html
作为程序员的我们,直奔主题吧,看看流引挚是怎么工作的,至少总体上有一个认识
- 将规则载入流引挚
- 设置规则文件里用到的一些变量
- 执行规则,并保存执行结果在上下文中(Context)
规则文件是通过xml来定义的,规则文件主要包含以下这三部分
- rules
- logic tests
- structure
<
Integer
id
="10i"
value
="10"
/>
< Integer id ="40i" value ="40" />
相当于
< Integer id ="40i" value ="40" />
int
10i
=
10
;
int 40i = 40 ;
还可以引用到外部变量
int 40i = 40 ;
<
ObjectLookup
id
="QuantityOrdered"
objectId
="CurrentOrder"
member
="
"
/>
相当于
//
前提是CurrentOrder作为一个类的实例已经被增加到上下文中,当然,这里是弱类型的
object QuantityOrdered = CurrentOrder.QuantityOrdered;
逻辑块
object QuantityOrdered = CurrentOrder.QuantityOrdered;
<
Logic
>
< If >
< And >
< GreaterThan leftId ="QuantityOrdered" rightId ="40i" />
</ And >
< Do >
< Evaluate id ="AppliedDiscount" >
< Parameter name ="Percent" value =".9" />
</ Evaluate >
</ Do >
</ If >
< Else >
< Evaluate id ="AppliedDiscount" >
< Parameter name ="Percent" value ="1" />
</ Evaluate >
</ Else >
</ Logic >
伪码是
< If >
< And >
< GreaterThan leftId ="QuantityOrdered" rightId ="40i" />
</ And >
< Do >
< Evaluate id ="AppliedDiscount" >
< Parameter name ="Percent" value =".9" />
</ Evaluate >
</ Do >
</ If >
< Else >
< Evaluate id ="AppliedDiscount" >
< Parameter name ="Percent" value ="1" />
</ Evaluate >
</ Else >
</ Logic >
if
(QuantityOrdered
>
40i)
{
Percent = 0.9;//这里可以被规则以外的程序访问到,是规则的执行结果
}
else
{
Percent = 1;
}
{
Percent = 0.9;//这里可以被规则以外的程序访问到,是规则的执行结果
}
else
{
Percent = 1;
}
流引挚的实现中基本上都合理的定义和使用接口,看看这几个比较重要的接口
Process方法,不用说了,最重要的,执行规则的开关
RuleContext属性,就更不用说了,规则定义文件的所有变量,以及引用到的外部变量,甚至是执行结果都存放在这里
命名空间 NxBRE.FlowEngine.Rules | 描述 |
Decrement* | 自减整数 |
Exception | 抛出异常 |
False,True | |
FatalException | 重大异常 |
Increment | 自增整数 |
IncrementInit* | Incrementor or Decrementor reset. |
ObjectLookup | 通过反射映射到ruleContext中的类或者实例 |
Value | 任何类型的变量 |
哎,这个表格真是不好整啊,凑合着吧,虽然是丑了点,不过符合自己的美工表现...
上面这些就不用注释了,看字面都知道是什么意思了,强调一下,正则表达式的支持,将给扩展留下巨大的空间
载入规则文件的时候要用到这些东东,比如xbre文件就要用到XBusinessRulesFileDriver
工厂,创建IFlowEngine实例
好了,说了一堆,看起来好像没什么用...
来个HelloWorld,至少让我知道这是个什么东西