纸壳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. application/json 和 application/x-www-form-urlencoded的区别

    public static string HttpPost(string url, string body) { //ServicePointManager.ServerCertificateVali ...

  2. logger 的使用一 小结

    方式一 依赖: <!-- log start --> <dependency> <groupId>log4j</groupId> <artifac ...

  3. react之echarts数据更新

    react之echarts数据更新 在使用setState更新数据时,如果要将图标更新,需要做一些简单的封装,代码如下: import React, { Component } from 'react ...

  4. CPU GPU FPU TPU 及厂商

    1,AMD 既做CPU又做显卡2,Inter 全球最大的CPU厂商,GPU,FPGA3,NVIDA 人工智能起家的公司,且一直在做,显卡最出名,CUDA让N卡胜了AMD CPU上 AMD - Inte ...

  5. 更改Eclipse里的Classpath Variables M2_REPO

    M2_REPO这个classpath  variable 是不能改变的. 为什么 Eclipse 里的 Classpath Variables M2_REPO 无法修改(non modifiable) ...

  6. rundeck

    docker run -d -p 4440:4440 -e EXTERNAL_SERVER_URL=http://109.105.4.65:4440 -v/root/rundeck:/var/rund ...

  7. Python next() 函数

    Python next() 函数  Python 内置函数 描述 next() 返回迭代器的下一个项目. 语法 next 语法: next(iterator[, default]) 参数说明: ite ...

  8. 使用ES(elasticsearch) 搜索引擎

    介绍  https://blog.csdn.net/andyzhaojianhui/article/details/75195296 创建语句 { "company":{ &quo ...

  9. Magic Potion(最大流,跑两遍网络流或者加一个中转点)

    Magic Potion http://codeforces.com/gym/101981/attachments/download/7891/20182019-acmicpc-asia-nanjin ...

  10. for 续8

    ---------siwuxie095                 一个问题分析: 在 CMD 窗口输入: dir dir /b dir /b /ah dir C:\Windows dir C:\ ...