纸壳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. 线程等待 Join()方法

    Join()方法是让一个线程等待另一个线程的完成 下面看个例子: package project11; public class TestJoin extends Thread { public vo ...

  2. .NET 同步 异步 委托

    1.定义委托: using System; using System.Collections.Generic; using System.IO; using System.Linq; using Sy ...

  3. leetcode807

    class Solution { public: int maxIncreaseKeepingSkyline(vector<vector<int>>& grid) { ...

  4. Visio2013 64位下载安装以及破解激活教程

    特别说明:以下教程如果未能破解激活,请在断网条件下安装破解!!!! 安装: Visio2013 professional版下载地址:https://pan.baidu.com/s/1gzwcGTevV ...

  5. WebFont-前端字体

    WebFont-前端字体 前端设计时使用了一些不常用的字体,如何在客户的浏览器中正确展示? 解决方案是使用webfont,将字体置于服务端,利用 css 中的font-family进行设置,客户端展现 ...

  6. sass对象的定义

    sass在3.3引入map类型,它与JS的对象非常相似,它有两种定义模式.外面都是用小括号括括起来,每个键值对可以像JS那样与逗号分开.不同之后是,键名与键值之间的冒号不是 必须的 不用对象的情况 @ ...

  7. 什么是First-class citizen?

    [什么是First-class citizen?] In programming language design, a first-class citizen (also type, object,  ...

  8. Axure知识点

    1 一个事件包含N个用例:一个用例包含N个动作.

  9. 2015年传智播客JavaEE 第168期就业班视频教程day38-SSH综合案例-1

    为什么需要划分模块呢?因为需要知道一些大致的功能,其次呢需要知道我们后台需不需要对它进行维护.如果需要呢那它肯定是一个单独的模块, 1.1    网上商城需求分析: 1.1.1 前台:用户模块 注册: ...

  10. tomcat限制ip访问

    context元素添加 <Context> <Valve className="org.apache.catalina.valves.RemoteAddrValve&quo ...