纸壳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中的全局内容就应用了该表达式引擎,满足规则的内容就会加入到页面中:
