• 纸壳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);
        }
    }

    主要有两个方法,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

  • 相关阅读:
    MySql锁机制
    Mysql存储引擎
    Linux 系统中安装mysql
    常见的系统架构
    Linux环境下搭建go开发环境
    Ajax概述
    正向代理和反向代理
    Mysql 存储过程以及在.net中的应用示例
    Mysql 事务
    Windows服务器实现自动化部署-Jenkins
  • 原文地址:https://www.cnblogs.com/seriawei/p/9188114.html
Copyright © 2020-2023  润新知