纸壳CMS3.0中的规则引擎,用于计算通用表达试结果。通常业务逻辑总是复杂多变的,使用这个规则引擎可以灵活的修改计算表达式。
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
IRuleProvider,是规则提供程序,该接口只有一个方法,用于处理对应的规则和返回结果:
namespace Easy.RuleEngine
{
public interface IRuleProvider
{
void Process(RuleContext ruleContext, object workContext);
}
}
IRuleProvider,是规则引擎的主要扩展方式,实现该接口,即可现实一个特定的规则处理。
CommonMethodsRuleProvider
提供了以下可用的方法:
ruleManger.IsTrue("Equals(1,1)")
ruleManger.IsTrue("NotEquals('1',1)")
ruleManger.IsTrue("StartsWith('123','1')")
ruleManger.IsTrue("EndsWith('123','3')")
ruleManger.IsTrue("Contains('123','2')")
ruleManger.IsTrue("NotStartsWith('123','2')")
ruleManger.IsTrue("NotEndsWith('123','2')")
ruleManger.IsTrue("NotContains('123','4')")
ruleManger.IsTrue("IsBlank('')")
ruleManger.IsTrue("IsNotBlank('3')")
ruleManger.IsTrue("In('1',['1','2','3'])")
ruleManger.IsTrue("NotIn('1',['1','2','3'])")
ruleManger.IsTrue("GreaterThan(2,1)")
ruleManger.IsTrue("GreaterThanOrEquals(1,1)")
ruleManger.IsTrue("LessThan(1,1)")
ruleManger.IsTrue("LessThanOrEquals(1,1)")
ValueOfRuleProvider
用于获取“WorkContext”中的值:
ruleManger.Value("ValueOf('Name')", new { Name = "A" })
ruleManger.IsTrue("ValueOf('Name',2)='B'",new{Name=new string[]{"A","B"}})
DateRuleProvider
用于将字符串转为日期类型:
ruleManger.Value("Date('2018-05-15')")
MoneyRuleProvider
用于将字符串转为货币类型:
ruleManger.IsTrue("Money('3.1')>1.0")
IsTrue
和Value
两个方法都有同样一个重载,即可传入一个“WorkContext”。这个WorkContext可以理解为表达式的应用上下文,即表达式的工作“环境”,表达式可以在该“WorkContext”中取对应的值进行计算。
该规则引擎支持以下简单运算符:
ruleManger.Value("1+2")
ruleManger.Value("1-2")
ruleManger.Value("2*2")
ruleManger.Value("2/2")
ruleManger.IsTrue("3.1>1.0 and 2>1")
或者 ruleManger.IsTrue("3.1>1.0 && 2>1")
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}:
当公式有变更,直接修改表达式就可以了。
纸壳CMS中的条件规则就应用了该表达式引擎,满足条件规则的内容就会在到页面区域中显示: