纸壳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. Windows 程序 dump 崩溃调试

    Windows 程序捕获崩溃异常 生成dump 概述 事情的起因是,有个同事开发的程序,交付的版本程序,会偶尔随机崩溃了. 悲催的是没有输出log,也没有输出dump文件. 我建议他给程序代码加个异常 ...

  2. RabbitMQ 信道(channel)挂掉,但连接仍然存在,同时出现错误:Received remote Channel.Close (406): PRECONDITION_FAILED - unknown delivery tag x 的问题

    该问题经过一番试验,发现是消费者(consumer)程序逻辑错误导致:在消息处理的回调函数中多次ack或nack. 开启Python日志,并在回调函数中两次ack得到如下信息: F:\software ...

  3. Java 8 字符串日期排序

    public class ObjectDto implements Serializable { private static final long serialVersionUID = 858983 ...

  4. XACT Q&A (转)

    XACT Q&A 传送门:http://blog.csdn.net/xoyojank/article/details/4098633

  5. linux Crontab 使用

    cron 用法说明 全文如下: cron来源于希腊单词chronos(意为“时间”),是linux系统下一个自动执行指定任务的程序.例如,你想在每晚睡觉期间创建某些文件或文件夹的备份,就可以用cron ...

  6. 【330】word - VBA 相关实现

    参考:Object model (Word VBA reference) 序号 类名称   功能说明   语法 & 举例 01 Selection   ====<<<< ...

  7. SVN代理设置

    [SVN代理设置] ~/.subversion/servers文件下可以配置svn的代理. 打开上面那3行,替换为自定义的域名即可.

  8. x64位windows 2003 server中“Server 对象 错误 'ASP 0177 : 800700c1' Server.CreateObject 失败”问题

    给朋友看一个老asp网站图片不能上传问题,试过网上各种办法都提示: Server 对象 错误 'ASP 0177 : 800700c1' Server.CreateObject 失败 最终问题出在x6 ...

  9. 完全使用ASP.NET实现的省市区级联效果

    本功能特点:下级的显示和数据的加载都是由上一级下拉框的SelectedIndexChanged触发的,在上级下拉框没有选择之前,下级不会出现,用户体验比较好.无刷新方面,采用AJAX技术,在数据选择的 ...

  10. 最多有k个不同字符的最长子字符串 · Longest Substring with at Most k Distinct Characters(没提交)

    [抄题]: 给定一个字符串,找到最多有k个不同字符的最长子字符串.eg:eceba, k = 3, return eceb [暴力解法]: 时间分析: 空间分析: [思维问题]: 怎么想到两根指针的: ...