纸壳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

纸壳CMS3.0中的规则引擎,表达式计算的更多相关文章

  1. 使用规则引擎Drools计算圆周率PI

    实际上是使用规则引擎能够更新工作内存区重新匹配规则实现迭代功能. 使用了策略模式实现. <规则引擎与RETE算法介绍> PPT : http://files.cnblogs.com/lov ...

  2. 纸壳CMS 3.0升级.Net Core 2.1性能大提升

    微软发布了.Net Core 2.1正式版,纸壳CMS也在第一时间做了升级,并做了一系列的优化和调整,性能大幅提升,并解决了一些历史遗留问题,添加了一些新功能. Github https://gith ...

  3. 在Docker中运行纸壳CMS并配置使用MySql

    纸壳CMS是基于ASP.Net Core开发的可视化内容管理系统,可以跨平台部署,可以在容器中运行.接下来看看如何在docker中运行纸壳CMS. GitHub:https://github.com/ ...

  4. Scala化规则引擎

    1. 引言 什么是规则引擎 一个业务规则包含一组条件和在此条件下执行的操作,它们表示业务规则应用程序的一段业务逻辑.业务规则通常应该由业务分析人员和策略管理者开发和修改,但有些复杂的业务规则也可以由技 ...

  5. .Net Core 环境下构建强大且易用的规则引擎

    本文源码: https://github.com/jonechenug/ZHS.Nrules.Sample 1. 引言 1.1 为什么需要规则引擎 在业务的早期时代,也许使用硬编码或者逻辑判断就可以满 ...

  6. [z]规则引擎

    https://www.ibm.com/developerworks/cn/java/j-drools/ 使用声明性编程方法编写程序的业务逻辑 使用规则引擎可以通过降低实现复杂业务逻辑的组件的复杂性, ...

  7. 规则引擎.Net Core

    .Net Core 环境下构建强大且易用的规则引擎 https://www.cnblogs.com/chenug/p/9160397.html 本文源码: https://github.com/jon ...

  8. 第四章 在MVC4.0中对脚本以及样式表的引用变化

    原文:http://www.cnblogs.com/xdotnet/archive/2012/07/21/aspnet40_webpage20.html 一.可以直接使用“~”,而无需使用Href对象 ...

  9. WebSphere ILOG JRules 规则引擎运行模式简介

    WebSphere ILOG JRules 规则引擎运行模式简介 引言 作为 JRules 的核心组件,规则引擎决定了在规则集的执行过程中,哪些业务规则会被执行,以及以何种顺序执行.理解并合理选择规则 ...

随机推荐

  1. centos7开发环境配置总结

    1.win10下SecureCRT SSH连接慢 2.CentOS 7下Samba服务器的安装与配置 3.

  2. maven install 跳过测试

    mvn命令跳过测试:mvn install -Dmaven.test.skip=true 测试类不会生成.class 文件mvn install -DskipTests 测试类会生成.class文件 ...

  3. How To Manually Install Oracle Java on Ubuntu

    Introduction Java is a programming technology originally developed by Sun Microsystems and later acq ...

  4. 最全互联网Linux工作规划!

    首先祝贺你选择学习Linux,你可能即将踏上Linux的工作之旅,出发之前,让我带你来看一看关于Linux和Linux运维的一切. Linux因其高效率.易于裁剪.应用广等优势,成为了当今中高端服务器 ...

  5. centos7虚拟机安装elasticsearch6.4.x-遇到的坑

    OS:Centos7x虚拟机 1H2Gjdk:1.8elasticsearch:5.6.0 1.下载“elasticsearch-5.6.0.tar.gz”解压到/usr/local/elastics ...

  6. 利用 Chrome 原生工具进行网页长截图

    转自https://sspai.com/post/42193 要想使用截图功能,你需要首先确保 Chrome 已升级至 59 或更高版本.在想要截图的网页中,首先按下 ⌘Command + ⌥Opti ...

  7. 如果应用程序正在通过 <identity impersonate="true"/> 模拟,则标识将为匿名用户(通常为 IUSR_MACHINENAME)或经过身份验证的请求用户。

    在配置文件中添加 <identity   impersonate= "true "   userName= "Administrator "   pass ...

  8. 解决windows搭建jenkins执行selenium无法启动浏览器问题

    因为jenkins是用windows installer 安装成windows的服务了,那么jenkins是一个后台服务,所以跑selium cases 的时候不显示浏览器 Step 1. Contr ...

  9. medusa爆破路由

    medusa –M http -h 192.168.10.1 -u admin -P /usr/share/wfuzz/ wordlist/fuzzdb/wordlists-user-passwd/p ...

  10. canvas里调用getImageData的报security的问题

    canvas元素支持绘制任意图片元素: var ctx = document.getElementById("canvas").getContext("2d") ...