纸壳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);
}
}
主要有两个方法,IsTrue和Value
- 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
IsTrue和Value两个方法都有同样一个重载,即可传入一个“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中的规则引擎,表达式计算的更多相关文章
- 使用规则引擎Drools计算圆周率PI
实际上是使用规则引擎能够更新工作内存区重新匹配规则实现迭代功能. 使用了策略模式实现. <规则引擎与RETE算法介绍> PPT : http://files.cnblogs.com/lov ...
- 纸壳CMS 3.0升级.Net Core 2.1性能大提升
微软发布了.Net Core 2.1正式版,纸壳CMS也在第一时间做了升级,并做了一系列的优化和调整,性能大幅提升,并解决了一些历史遗留问题,添加了一些新功能. Github https://gith ...
- 在Docker中运行纸壳CMS并配置使用MySql
纸壳CMS是基于ASP.Net Core开发的可视化内容管理系统,可以跨平台部署,可以在容器中运行.接下来看看如何在docker中运行纸壳CMS. GitHub:https://github.com/ ...
- Scala化规则引擎
1. 引言 什么是规则引擎 一个业务规则包含一组条件和在此条件下执行的操作,它们表示业务规则应用程序的一段业务逻辑.业务规则通常应该由业务分析人员和策略管理者开发和修改,但有些复杂的业务规则也可以由技 ...
- .Net Core 环境下构建强大且易用的规则引擎
本文源码: https://github.com/jonechenug/ZHS.Nrules.Sample 1. 引言 1.1 为什么需要规则引擎 在业务的早期时代,也许使用硬编码或者逻辑判断就可以满 ...
- [z]规则引擎
https://www.ibm.com/developerworks/cn/java/j-drools/ 使用声明性编程方法编写程序的业务逻辑 使用规则引擎可以通过降低实现复杂业务逻辑的组件的复杂性, ...
- 规则引擎.Net Core
.Net Core 环境下构建强大且易用的规则引擎 https://www.cnblogs.com/chenug/p/9160397.html 本文源码: https://github.com/jon ...
- 第四章 在MVC4.0中对脚本以及样式表的引用变化
原文:http://www.cnblogs.com/xdotnet/archive/2012/07/21/aspnet40_webpage20.html 一.可以直接使用“~”,而无需使用Href对象 ...
- WebSphere ILOG JRules 规则引擎运行模式简介
WebSphere ILOG JRules 规则引擎运行模式简介 引言 作为 JRules 的核心组件,规则引擎决定了在规则集的执行过程中,哪些业务规则会被执行,以及以何种顺序执行.理解并合理选择规则 ...
随机推荐
- Yii中利用filters来控制访问
filters()方法定义在CController里,用Gii生成Controller时里面就有filters方法,代码如下: public function filters() { // retur ...
- 【独家】阿里天池IJCAI17大赛第四名方案全解析(附代码)
[独家]阿里天池IJCAI17大赛第四名方案全解析(附代码) https://mp.weixin.qq.com/s?__biz=MzAxMzA2MDYxMw==&mid=2651560625& ...
- 新手C#属性set,get的学习(部分转)2018.08.06
public class person { public string name; } public class person { public string Name { set; get; } } ...
- What I'm Researching
[What I'm Researching] 1.C++11 2.NLP 3.android dev 4.warm up 5.PageRank
- NBU 还原windows ORACLE数据库(FP)
二.基于差异备份恢复7月20日星期四早上8:30分数据1.查询所需要的归档日志(因为要返回20号刂8:30分的数据,所以控制 文件要晚于这个点,即取21号凌晨2点备份的控制文件) bplist -C ...
- Android开发之通过包管理器获取安装应用信息
最近在自己写一个APP,有一个模块需要获取手机应用的一些信息.坑还是有,但都基本踩过了,自己把他实现了出来,实现方法还是很需要掌握的.底部弹出的对话框中四个选项的实现不多做说明,主要讲讲如何获取这些安 ...
- params must be [a-zA-Z0-9] for verification sms
阿里短信发送短信时返回这个信息,之前是可以发送的,现在阿里应该是做了限制的.如果你的短信模板类型为“验证码”,发送的短信内容只能是包含字母和数字 所以当你的短信内容包含特殊符号和中文时,请把短信模板类 ...
- 线程并发线程安全介绍及java.util.concurrent包下类介绍
线程Thread,在Java开发中多线程是必不可少的,但是真正能用好的并不多! 首先开启一个线程三种方式 ①new Thread(Runnable).start() ②thread.start(); ...
- 初识STM32
1.什么是STM32 A.ST是意法半导体,一个公司名,即SOC厂商,生产芯片的厂商.ARM公司是IP厂商,即只生产内核的厂商. B.M-Microelectronics的缩写,表示微控制器,大家注意 ...
- JVM 垃圾回收- 转载 知识碎片
最近关注了一下垃圾回收的问题,想了解一下JVM 关于方法区的垃圾回收机制,找了几篇文章,不同的文章从不同角度讲述了一下,嗯... 拼凑起来 记录一下, 有些未验证正确性... JVM 方法区 当JVM ...