纸壳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); } }
主要有两个方法,IsTrue
和Value
- 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
IsTrue
和Value
两个方法都有同样一个重载,即可传入一个“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中的全局内容就应用了该表达式引擎,满足规则的内容就会加入到页面中: