WWF规则引擎ruleEngine的一个开发例子
来源:互联网 发布:最新网络灰色项目干货 编辑:程序博客网 时间:2024/06/04 21:16
这两天写一个研究性的材料,主要是关于基于规则驱动的业务开发,于是找了相关资料来看,以下是一篇我认为结合MS的WWF中ruleEngine,讲得很通俗易懂的,关于规则的原理和实现逻辑的文章。看完后,基本能对规则的实现原理和适用场景有一个概要的认识,转过来,便于收藏。
原文地址如下:
http://www.csharpwin.com/csharpspace/2673.shtml
工作流中的RuleEngine是非常重要的一块功能,主要用来计算一些表达式的真假值。
其他一些工作流中一般是使用外挂的一些RuleEngine,或者自己实现自己的特定的Engine。
WWF中集成了一个功能强大的RuleEnggine。这里是英文文章原文:http://msdn.microsoft.com/windowsvista/default.aspx?pull=/library/en-us/dnlong/html/intWF_FndRlsEng.asp
WWF中有两类规则:Condition和Forward Chaining。
1:Condition
Condtion是一种简单的逻辑表达式,比如“if (a>5) then b=6;”
Condtion一般用在IfElseBranch;While;Replicator;Condition Activety Group中
Condtion有两种表达方式,其一是CodeCondtion,顾名思义,就是自己写判断代码;其二是RuleCondtionRefernce,定义在一个xml文件中(xxx.Rules文件)。建议使用第二种,因为这种逻辑可以随时修改。这是一个Rule的xml文件的例子
RuleSet是一组Rule的集合。不同的是,这些Rule是有优先级(Priority)的。可以用在诸如FilterPolicy中。
RuleSet的这些Rule的计算也是有特点的:根据优先级和判断条件的“关联性”在运行时来重新计算。重新计算的含义是,从优先级最高的依次在计算一次,而不是计算完关联之后回到原点继续计算。
举个例子,现在有这么四个条件判断
IF A = 15
THEN B = 5
Rule3 (P=3)
IF C = 5
THEN B = 10
Rule2 (P=2)
IF D = 2
THEN A = 15
Rule1 (P=1)
IF B = 5
THEN E = 7
初始数据如下:
- A = 0
- B = 0
- C = 5
- D = 2
- E = 0
运行之后,结果如下:
- A = 15
- B = 5
- C = 5
- D = 2
- E = 7
运行逻辑是这样的:首先执行Rule4,不符合;执行Rule3,设置B=10;执行Rule2,设置A=15;因为A的值已经改变,所以重新返回Rule4,执行设置B=5;依次检查都不符合条件;执行Rule1,设置E=7。
2:ForwardChaining
这一个有三种方式:Inplicit;Attributed-Based;Explicit
Inplicit:隐式表达式。隐式表达就是不指名条件变量之间的关系,直接写。比如
B=2;
Rule2 if(B=2)
C=4;
Rule2中的条件变量B就是隐式的和Rule1有关的。每当Rule1执行设置B的值的时候,Rule都需要重新计算。这一写都是自动完成的。
Attributed-Based:通过属性来标明哪些是对条件表达式的修改。属性有三种:RuleRead,RuleWrite,RuleInvoke。
比如,上边的例子中,如果Rule1中不是直接设置B=2,而是调用一个函数F1,F1设置了B的值,那么,我们就需要给F1一个属性RuleWrite:
if(A=2)
F1()
Rule2
if(B=2)
c=5
[RuleWrite("B")]
F1()
{
B=2;
}
如果调用还要复杂,F1又调用另外一个函数F2,F2才真正修改B的话,就得使用RuleInvoke属性了,比如
if(A=2)
F1()
Rule 2
if(B=2)
c=5;
[RuleInvoke("F2")]
F1()
{
F2();
}
[RuleWrite("B")]
F2()
{
B=2;
}
至于Expicit显式方式声明,可以用前两种来组合实现,一般用到的较少。Expicit使用Update()方法来更新变量的值。
- WWF规则引擎ruleEngine的一个开发例子
- wwf工作流和自开发工作流引擎的比较
- 规则引擎的使用---积分例子
- 【规则引擎连载2】 WebSphere ILOG JRules 开发——新建一个规则项目的bom
- 一个工作流引擎的例子
- 一个工作流引擎的例子
- WWF 小例子
- 基于jboss rule规则引擎的商务折扣例子
- 自定义规则排序数组的一个例子
- 规则引擎开发小结
- JBPM工作流引擎测试的一个例子
- 【规则引擎连载3】 WebSphere ILOG JRules 开发——新建一个规则项目
- 一个小学题目的解: 规则引擎Drools实现
- 一个ldap开发的例子
- 未来软件开发的主流方向:规则引擎 (Rule Engine)
- 未来软件开发的主流方向:规则引擎 (Rule Engine)
- WWF(Windows Workflow Foundation)开发环境的建立
- Java方法重载后的匹配规则的一个例子
- Android蓝牙开发浅析
- [leetcode] Remove Duplicates from Sorted List
- UVa 11388 - GCD LCM
- 完整归并排序C++代码
- java性能优化开发之--禁用System.out.println
- WWF规则引擎ruleEngine的一个开发例子
- Android系统的开机画面显示过程分析
- JAVA设计模式五大原则
- 关于java.lang.IllegalArgumentException: 'dataSource' or 'jdbcTemplate' is required 类似问题的解决总结
- 反射方法总结
- QTP技巧(上)
- 截取屏幕图片
- redis 和 客户端使用
- Git使用