纸壳CMS3.0中的规则引擎

纸壳CMS3.0中的规则引擎,用于计算通用表达试结果。通常业务逻辑总是复杂多变的,使用这个规则引擎可以灵活的修改计算表达式。

IRuleManager

IRuleManager,是使用规则引擎的主要接口:

namespace Easy.RuleEngine
{
    public interface IRuleManager
    {
        bool IsTrue(string expression);
        bool IsTrue(string expression, object workContext);
        object Value(string expression);
        object Value(string expression, object workContext);
    }
}

主要有两个方法,IsTrueValue

  • IsTrue:用于判断表达式的结果是否为真
  • Value:用于获取表达的计算结果

IRuleProvider

IRuleProvider,是规则提供程序,该接口只有一个方法,用于处理对应的规则和返回结果:

namespace Easy.RuleEngine
{
    public interface IRuleProvider
    {
        void Process(RuleContext ruleContext, object workContext);
    }
}

IRuleProvider,是规则引擎的主要扩展方式,实现该接口,即可现实一个特定的规则处理。

已有的规则处理程序

  • CommonMethodsRuleProvider
  • ValueOfRuleProvider
  • DateRuleProvider
  • MoneyRuleProvider

CommonMethodsRuleProvider提供了以下可用的方法:

  • Equals:ruleManger.IsTrue("Equals(1,1)")
  • NotEquals:ruleManger.IsTrue("NotEquals('1',1)")
  • StartsWith:ruleManger.IsTrue("StartsWith('123','1')")
  • EndsWith:ruleManger.IsTrue("EndsWith('123','3')")
  • Contains:ruleManger.IsTrue("Contains('123','2')")
  • NotStartsWith:ruleManger.IsTrue("NotStartsWith('123','2')")
  • NotEndsWith:ruleManger.IsTrue("NotEndsWith('123','2')")
  • NotContains:ruleManger.IsTrue("NotContains('123','4')")
  • IsBlank:ruleManger.IsTrue("IsBlank('')")
  • IsNotBlank:ruleManger.IsTrue("IsNotBlank('3')")
  • In:ruleManger.IsTrue("In('1',['1','2','3'])")
  • NotIn:ruleManger.IsTrue("NotIn('1',['1','2','3'])")
  • GreaterThan:ruleManger.IsTrue("GreaterThan(2,1)")
  • GreaterThanOrEquals:ruleManger.IsTrue("GreaterThanOrEquals(1,1)")
  • LessThan:ruleManger.IsTrue("LessThan(1,1)")
  • LessThanOrEquals:ruleManger.IsTrue("LessThanOrEquals(1,1)")

ValueOfRuleProvider用于获取“WorkContext”中的值:

  • ValueOf:ruleManger.Value("ValueOf('Name')", new { Name = "A" })
  • ValueOf取数组中的值:ruleManger.IsTrue("ValueOf('Name',2)='B'",new{Name=new string[]{"A","B"}})

DateRuleProvider用于将字符串转为日期类型:

  • Date:ruleManger.Value("Date('2018-05-15')")

MoneyRuleProvider用于将字符串转为货币类型:

  • Money:ruleManger.IsTrue("Money('3.1')>1.0")

WorkContext

IsTrueValue两个方法都有同样一个重载,即可传入一个“WorkContext”。这个WorkContext可以理解为表达式的应用上下文,即表达式的工作“环境”,表达式可以在该“WorkContext”中取对应的值进行计算。

运算符

该规则引擎支持以下简单运算符:

  • +:ruleManger.Value("1+2")
  • -:ruleManger.Value("1-2")
  • *:ruleManger.Value("2*2")
  • /:ruleManger.Value("2/2")
  • and,&&:ruleManger.IsTrue("3.1>1.0 and 2>1") 或者 ruleManger.IsTrue("3.1>1.0 && 2>1")
  • or,||:ruleManger.IsTrue("3.1>1.0 or 2<1") 或者 ruleManger.IsTrue("3.1>1.0 || 2<1")
  • ():ruleManger.Value("3*(1+2)")

数据类型

规则引擎中可直接使用以下数据类型:

  • 字符串:用单引号或者双引号表示一个字符串
  • 数字:直接使用数字,或带有小数点的数字

简单示例

例如当前计算利润的公式为:(总价-物流费)*12%,已经定义好的workContext: {Total,ShipAmt}:

  • ruleManger.Value("(ValueOf('Total')-ValueOf('ShipAmt'))*0.12",new {Total=500,ShipAmt=12})

当公式有变更,直接修改表达式就可以了。

在CMS中的应用

纸壳CMS3.0中的全局内容就应用了该表达式引擎,满足规则的内容就会加入到页面中:

原文地址:http://www.zkea.net/zkeacms/document/rule

原文链接:http://www.zkea.net/zkeacms/document/rule

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏精讲JAVA

Java 8 和 Java 9 中并发工具的改变

Java 8 和 Java 9中 concurrent 包有了一些改变, 本文对这些改变做了汇总。

802
来自专栏圣杰的专栏

ABP入门系列(8)——Json格式化

讲完了分页功能,这一节我们先不急着实现新的功能。来简要介绍下Abp中Json的用法。为什么要在这一节讲呢?当然是做铺垫啊,后面的系列文章会经常和Json这个东...

2249
来自专栏Ryan Miao

(转载)Java8新的日期API LocalDate, LocalTime

由于Java Date的各种问题,Java8推出了新的日期API,很受一拨人的追捧。

773
来自专栏马洪彪

C#仪器数据文件解析-XPS文件

XPS为微软推出的类似于Adobe PDF的一种文件格式,个人认为XPS很好,但毕竟PDF已经被大家所熟知,因此XPS的使用很少,也少有仪器数据输出为该格式。 ...

3344
来自专栏我杨某人的青春满是悔恨

走进 RxSwift 之观察者模式

RxSwift 是 ReactiveX 系列的 Swift 版本,如果你之前用过 ReactiveCocoa(RAC) 的话,想必对 Functional Re...

1032
来自专栏Java与Android技术栈

为了程序的健壮性,我们可以使用空对象模式

在写代码的时候我们经常会遇到空指针,为了避免空指针的发生需要做一些判断。如果是复杂对象的话,还需要一层层地去判断。这个时候我就无比怀念groovy、kotlin...

932
来自专栏一名叫大蕉的程序员

来人啊给我炸了那个Java虚拟机No.46

你指尖跃动的电光,是我此生不灭的信仰,唯我超电磁炮永世长存。 瞬间爆炸,完成单杀。 深度长文,非常非常长,执行这些程序可能导致机器完全死机,请遵照指示安全开车。...

1859
来自专栏听雨堂

字符串处理总结(旧)

在各类应用软件的开发中,字符串操作是最常见的操作之一。在各种不同的数据类型中,字符串类型是和现实世界关联最紧密的。对字符串的读入、比较、拼接、搜索、匹配、替换、...

1918
来自专栏Golang语言社区

go的非侵入式接口

什么是接口 接口就是一组方法的集合。比如下面这个例子,几何图形接口就包含了面积与周长两个方法,对于任何实现了这两个方法的type,都属于几何图形。 type G...

3254
来自专栏精讲JAVA

Java 8 和 Java 9 中并发工具的改变

Java 8 和 Java 9中 concurrent 包有了一些改变, 本文对这些改变做了汇总。

1132

扫码关注云+社区