这次继续学习WF中规则引擎中的相关知识。WF中的每一个规则都包括下面三部分:
1. 一个条件返回true或false
2. 一个then操作(当条件为true时执行)
3. 一个else操作(当条件为false时执行)
规则对应System.Workflow.Activities.Rules命名空间中中的Rule类,Rule类的ThenActions,ElseActions都是RuleAction对象的集合。RuleAction是一个抽象类,他的派生类RuleStatementAction指定要更新的属性或字段或要使用 CodeDom 类型运行的方法。还有RuleHaltActin和RuleUpdateAction派生类。RuleStatementAction可以使用简单的fieldA=10,或复杂的计算fieldA=fieldC*3.14,RuleStatementAction的语句块将被序列化为CodeDom对象,CodeDom对象来标识内部的源代码的架构,能动态的生成和编译。如果你使用规则编辑器,你可以不用了解他的细节,但是你要自己动态的在代码中声明规则,你就要好好了解下了。RuleHaltAction类导致 RuleSet停止执行并使控制重新返回到调用方法。RuleUpdateAction 类此类用于向规则引擎指示执行此规则的操作集可导致指定的字段或属性(或一个对象的所有字段和属性)发生更改,从而可以重新计算依赖于此字段或属性的任何规则。Update 调用不会阻止操作块中其他操作的执行。修改的字段/属性集(通过 Update 指定或通过对调用的方法使用 RuleWriteAttribute来指定)用于确定此特定规则的操作集完成执行时的链接。
我们可以将规则视为 IF-THEN-ELSE 语句,其中,条件对应于IF,而操作定义 THEN 和 ELSE 子句的行为。这样的一组规则便组成了规则集RuleSet,规则集既支持规则的简单依序执行,也支持规则的复杂正向链接。 规则集可以由PolicyActivity 活动执行。使用PolicyActivity活动时我们只需要将该活动拖到工作流设计器中, 然后配置 PolicyActivity 上的 RuleSetReference 属性,按名称指向 RuleSetCollection 中的 RuleSet。 PolicyActivity 活动创建 RuleSet 类的实例;规则是由 RuleSet 类执行的。下图为VS2008中的规则集编辑器:
我们可以看到每个规则都有一个(priority)优先级的属性,优先级大的会先执行。虽然设置优先级可以改变规则集中规则的执行顺序,但一般都不会去设置该属性,因为WF的规则引擎有重新计算的能力:(forward chaining)正向链接。下面我就来说说规则引擎中非常重要的正向链接特性。
正向链接
RuleSet类的ChainingBehavior属性表示获取或设置 RuleSet中 Rule 类的正向链接行为。决定规则引擎是如何执行正向链接的,这个属性的值是枚举类型RuleChainingBehavior。下面是各个取值的说明:
None(顺序的):指示不执行链接。每个规则只执行一次。
UpdateOnly(仅显示更新):指示如果已执行的操作使用 RuleUpdateAction 明确指定链接,则执行该链接。
Full(完全链接):指示由操作修改字段或属性、为由操作调用的方法指定 RuleWriteAttribute或执行 RuleUpdateAction时执行该链接。
下面举个例子:
Rule | Conditon | ThenAction | ElseAction |
Rule1 | A>10 | B=60 | B=40 |
Rule2 | B>50 | C="preferred" | C="normal" |
Rule3 | D<100 | B=B*0.80 |
我们可以看出A和D是输入变量,B和C是规则中设置的。如果我们使用完全正向链接的选项,规则引擎会自动根据这些规则来觉得是否需要重新计算之前的规则,比如A是12,D是99的话,
1. Rule1 A>10 所以B=60
2. 到了Rule2 B=60,大于50,所以C="preferred"
3. Rule3 D=99 <100 所以B=60*0.80=48
4. 这个时候B=48,B的值改变了,所以Rule2会重新计算,B<50 C="normal"
5. Rule3不会重新计算,因为他包含的变量自从第一次计算后没有变化。
最后的结果是B=48,C="normal",A D没有变化。如果你将正向链接的属性设为None属性的,每个规则将执行一次,最后的结果将是B=48,C="preferred"。
使用Update语句
有的时候我们不需要完全的正向链接,我们使用UpdateOnly,UpdateOnly 选项关闭隐式的、基于属性的链接,并规定链接只应对显式 Update 语句发生。 这使您能够完全控制哪些规则引起重新计算。 这个时候我们必须使用Update语句,通过这个语句可以告诉WF,某个属性一定会被修改了,相关的规则可能需要重新应用。
下面举例说明,
Rule | Conditon | ThenAction | ElseAction |
Rule1 | A>10 | B=60 ,Update(B) | B=40 ,Update(B) |
Rule2 | B>50 | C="preferred",Update(C) | C="normal",Update(C) |
Rule3 | D<100 | B=B*0.80,Update(B) |
Update语句在序列化到.rules文件的时候会生成RuleUpdateAction,每个Update语句表示是否被其他条件更改,使用此选项可以避免导致规则过度(甚至是失控)重复执行的循环依赖性,或者通过消除为提供 RuleSet 的功能完整性所不需要的规则重新计算来提高性能。
禁止规则重算
另一个影响规则计算的是Rule类的ReevaluationBehavior属性,获取或设置一个值,该值指示是否可以重新计算 Rule。其值为RuleReevaluationBehavior,默认是Always,还有Never.对应于上面图中的重新计算选项。
Always :为默认值,它提供了前面讨论过的行为,即,总是根据其他规则的操作所引起的链接重新计算规则。
Never: 顾名思义就是关闭重新计算。 规则计算一次,但如果该规则先前已执行了任何操作,则不进行重新计算。 换言之,如果先前计算过该规则,并因此执行了其 Then 或 Else 操作,则不会重新计算该规则。 但是,执行 Then 或 Else 操作中的空操作集合并不表示规则已经执行。
基于属性
当一个规则的条件或执行为字段或属性的时候,WF的规则引擎可以识别他们的关系来控制正向链接,如果是方法的时候就不行了,比如GetAccountStatus方法,我们可以猜到这个方法是获取Account的状态值,但是WF确猜不到,我们使用下面的一组属性来解决这个问题。
一共三个RuleReadAttribute,RuleWriteAttribute 和RuleInvokeAttribute 类分别表示用于读取条件、写入操作和调用方法的属性。通过属性来标明哪些是对条件表达式的修改。下面是例子:
Rule | Conditon | ThenAction |
Rule1 | this.discount > 0 | this.total = (1-this.discount) * this.subtotal |
Rule2 | this.subtotal > 10000 | this.SetDiscount(0.05) |
然后,可以将 SetDiscount 方法按如下方式进行属性设置。 这会使引擎能够标识规则 1 依赖于规则 2,因为使用了折扣字段。
[RuleWrite("discount")] void SetDiscount(double requestedDiscount) { ...//Some code that updates the discount field. }
RuleReadAttribute和RuleWriteAttribute 用法基本相同,RuleInvokeAttribute 属性可以用于指示由链接的方
法调用导致的依赖项。 例如,假定对规则和方法进行下列修改:
Rule | Conditon | ThenAction |
Rule1 | this.discount > 0 | this.total = (1-this.discount) * this.subtotal |
Rule2 | this.subtotal > 10000 | this.SetDiscountWrapper(0.05) |
[RuleInvoke("SetDiscount")]
void SetDiscountWrapper(double requestedDiscount)
{
SetDiscount(requestedDiscount);
}
[RuleWrite("discount")]
void SetDiscount(double requestedDiscount)
{
}
以下是有关使用属性的一些补充说明:
-
可以使用属性指定如何在方法中使用参数。 例如,通过对以下方法进行属性 (attribute) 设置,指示此方法修改传递的 Order 实例上的 Discount 属性 (property)。
[RuleWrite("currentOrder/Discount", RuleAttributeTarget.Parameter)] private void SetDiscount(Order currentOrder, double discount) { currentOrder.Discount = discount; }
-
在规则属性中还可以使用通配符。 例如,可以使用 RuleWrite("order/*") 指示此方法修改“order”字段引用的对象上的所有字段。 但是,只能在路径的末尾使用通配符;像 RuleWrite("*/Discount") 之类的属性无效。
-
像 RuleWrite("order") 之类的属性可以与引用类型一起使用以指示引用已更改,例如,指示变量目前指向其他 Order 实例。 除了测试实例引用本身的所有规则外,使用字段/属性的所有规则也都假定为受到影响;例如 IF this.order == this.order2。
-
在未指定方法属性情况下的默认行为,是假定方法调用在目标对象(即对其调用方法的对象)上不读取或写入任何字段/属性。 此外,假定该方法调用根据 .NET Framework 中定义的关键字(ref、out、ByVal、ByRef 等)读取参数和写入参数。
发表评论
-
平淡的2007
2007-12-24 08:04 813早上起来,送女朋友去公交车站,然后回来赶紧打开电脑,先 ... -
DreamSpark发布,高校学生免费使用Visual Studio 2008 Professional Edition 等微软软件
2008-02-20 13:23 1410今天上网无意中搜索到学生可以免费使用VS2008专业版,后来又 ... -
坚持学习WF(1):从HelloWorld开始
2008-04-04 16:30 888[置顶]坚持学习WF文章索 ... -
坚持学习WF(2):WF创作模式和设计时工具
2008-04-05 17:19 634[置顶]坚持学习WF文章索 ... -
坚持学习WF(3):WF框架概览
2008-04-08 07:27 782[置顶]坚持学习WF文章索 ... -
坚持学习WF(4):活动(Activity)和依赖属性(DependencyProperty)
2008-04-12 00:01 1142[置顶]坚持学习WF文章索引 活动(Activity) 活动 ... -
坚持学习WF(5):自定义活动(CustomActivity)
2008-04-13 15:25 918当WF提供的标准活动不能满足我们的需求的时候,我们就需要定义自 ... -
MOSS点滴(1):如何开发和部署feature
2008-04-16 21:35 834Features 是MOSS 2007以开箱即用的一套新功能, ... -
MOSS点滴(2):自定义Application Page
2008-04-19 20:07 841在MOSS中后台管理的页面都是Application Pag ... -
坚持学习WF(6):开发可复用的宿主程序
2008-04-21 21:45 692我们之前写工作流宿主 ... -
MOSS点滴(3):说说MOSS中的母版页
2008-04-25 21:15 1176MOSS中有两种页面:Site P ... -
MOSS点滴(4):实现Form认证
2008-04-29 21:12 701本文主要参考了网上的一些文章,但有些文章有些地方说的不是很明确 ... -
坚持学习WF(7):流程控制(Flow Control)
2008-04-30 18:10 829本文主要说说WF中和流 ... -
坚持学习WF(8):本地服务之调用外部方法
2008-05-09 08:17 754WF提供了一组核心服务 ... -
MOSS中的WebPart开发
2008-05-10 13:53 1054由于在asp.net1.1的时候asp.net中还没有webp ... -
坚持学习WF(9):本地服务之事件处理
2008-05-28 07:49 792[置顶]坚持学习WF文章索引 一:先来介绍两个活动 Even ... -
坚持学习WF(10):在工作流中使用关联
2008-06-01 13:03 687[置顶]坚持学习WF文章索 ... -
坚持学习WF(11):工作流通信与队列
2008-06-07 15:45 730[置顶]坚持学习WF文章索引 WF 提供的通信模型是构建于 ... -
MOSS中创建自定义内容类型
2008-06-12 20:23 1099一:简要介绍 某类内容 ... -
.NET中IDisposable接口的基本使用
2008-06-15 12:01 945首先来看MSDN中关于这个接口的说明: [ComVisible ...
相关推荐
坚持学习WF(21):规则引擎中的RuleSet 坚持学习WF(22):跟踪规则 坚持学习WF(23):以代码的方式构造和执行RuleSet WF提供了非常灵活,强大和简单易懂的规则引擎。这几篇文章介绍了WF中规则引擎的相关知识。 坚持学习...
坚持学习WF(20):规则引擎中的活动条件 坚持学习WF(21):规则引擎中的RuleSet 坚持学习WF(22):跟踪规则 坚持学习WF(23):以代码的方式构造和执行RuleSet WF提供了非常灵活,强大和简单易懂的规则引擎。这几篇文章介绍...
【基于WF的规则引擎超级简单】这一主题主要围绕着Windows Workflow Foundation (WF) 和规则引擎在C#开发中的应用展开。WF是微软提供的一种用于构建业务流程和规则引擎的框架,它使得开发者能够以声明式的方式定义...
PMD_ruleset规则文件,已经最基本的验证进行了导入。在Eclipse导入即可
规则引擎技术作为一种灵活且高效的业务逻辑管理工具,在现代软件开发中扮演着至关重要的角色。尤其在Java社区,规则引擎的应用越来越广泛,它不仅能够帮助软件架构师更好地应对多变的业务需求,还能提高系统的可维护...
"规则引擎学习指南"提供了详细的Drools入门教程和实战案例,帮助开发者快速掌握Drools的使用。此外,Drools的官方文档和社区论坛也是获取帮助和深入学习的重要资源。 总的来说,Drools作为一款强大的规则引擎,为...
- 学习如何在应用程序中集成规则引擎,如通过Java API调用规则引擎。 总的来说,规则流提供了一种灵活且可扩展的方法来处理复杂逻辑,尤其适合在需要动态决策的环境中。通过学习和实践,我们可以更好地理解和应用...
RuleSet 是一个编程概念,通常在规则引擎或者逻辑处理系统中使用。它是一组规则的集合,这些规则定义了特定条件下的行为或决策。在不同的上下文中,RuleSet 可能有不同的实现方式和用途,例如在业务流程管理、决策...
通过学习《Drools5规则引擎开发教程》,开发者不仅可以掌握如何创建、管理及执行业务规则,还能了解到如何将Drools集成到现有的Java应用中,以及如何优化规则引擎的性能。此外,这份教程可能还会介绍如何利用Drools...
`wazuh-ruleset-master`可能是Wazuh规则集的一个版本仓库,包含了规则文件的源代码或配置。用户需要按照官方文档的指引,将这些规则导入到Wazuh服务器中,然后配置代理以应用这些规则。 总结起来,Wazuh规则集是...
规则引擎在WF中用于动态改变工作流的行为,根据特定条件触发不同的路径。这部分会介绍如何使用RuleSet和Condition进行决策,并展示如何在工作流中应用规则。 Chapter15和Chapter16可能会探讨工作流服务(WF ...
规则包中的javabean内容规则包中的javabean内容规则包中的javabean内容规则包中的javabean内容规则包中的javabean内容
- **工作流引擎**: 处理业务流程控制,如任务分配、流程跳转等,Drools 5.5中结合了规则引擎,实现了规则与流程的集成。 3. **规则流创建** - 使用Drools Workbench或Drools Guvnor(现在称为Kie Workbench)进行...
愚蠢的示例规则,仅坚持要求API描述引用“ Example Corp”。 Gradle ./gradlew build 请注意,当前没有官方的公共Maven存储库来提供依赖项。 本示例使用存储库访问最新的master-SNAPSHOT 。 在Zally问题追踪。 ...
该Chrome扩展可视化您的应用程序中的数据流动。 如果您使用Redux-RuleSET模拟整个数据流,您不仅可以可视化数据流的原因,而且可以为什么数据不流动。 这是一个早期的产品,所以也许你会发现错误。 请向...
checkstyle_ruleset_minimal.xml
**ilog jRules 知识详解** ilog jRules 是IBM公司推出的一...通过学习提供的"ilog jrules例子(规则)",我们可以深入理解规则引擎的工作原理,掌握如何构建和应用规则,以及如何将这些规则应用于实际的保险业务场景中。
外部规则集工具包(ExternalRuleSetToolkit)是一个专门用于处理和管理规则引擎中外部规则集的工具。在IT行业中,规则引擎是一种软件系统,它允许业务规则与应用程序的其余部分分离,使得规则的修改和更新无需重新...
JSR-94(Java Specification Request 94)是Java平台企业版(Java EE)中的一个规范,它定义了一个标准接口,使得开发者能够将规则引擎集成到Java应用程序中。这个API允许应用程序与规则引擎进行交互,执行业务规则...