zoukankan      html  css  js  c++  java
  • 纸壳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

  • 相关阅读:
    Generate Parentheses
    Length of Last Word
    Maximum Subarray
    Count and Say
    二分搜索算法
    Search Insert Position
    Implement strStr()
    Remove Element
    Remove Duplicates from Sorted Array
    Remove Nth Node From End of List
  • 原文地址:https://www.cnblogs.com/seriawei/p/9188114.html
Copyright © 2011-2022 走看看