This simple rule engine is a .NET Standard library 2.0, which uses Microsoft's DLR DynamicExpressionParser in the background. The goal was to make a simple engine which is easy to use and compatible with many projects.
The IKernel interface is implemented with Kerner in order to support Inverson Of Control.
IKernelruleEngine=newKernel();The engine is designed to use any object as a rule which implements IRule interface in order to make it easy to use with an ORM.
publicinterfaceIRule{stringKey{get;set;}stringExpression{get;set;}}//...voidAddRule(IRulerule);//...String expressions can be simply against the object passed to the engine.
Creating a fact:
varfact=newPerson{Age=37,Income=45000,NumberOfChildren=3};Validating the fact:
varresult=ruleEngine.Validate(fact,"(f.Age > 3 && f.Income > 100000) || f.NumberOfChildren > 5");// result = falseMore than one expreession can be added to the engine
varrules=newList<Rule>{newRule{Key="1",Expression="(f.Age > 3 && f.Income < 50000) || f.NumberOfChildren > 2"},newRule{Key="2",Expression="(f.Age > 3 && f.Income > 100000) || f.NumberOfChildren > 5"}};ruleEngine.AddRules(rules);// Validate against all rules when no key passedvarresult=ruleEngine.ValidateAll(f);// result = false// Only validate against rules with the matching keyvarresult=ruleEngine.ValidateAll(f,"1");// result = trueThe calls are the same as the case of validate all, however it returns true if any case is true.
varrules=newList<Rule>{newRule{Key="1",Expression="(f.Age > 3 && f.Income < 50000) || f.NumberOfChildren > 2"},newRule{Key="2",Expression="(f.Age > 3 && f.Income > 100000) || f.NumberOfChildren > 5"}};ruleEngine.AddRules(rules);// Validate against all rules when no key passedvarresult=ruleEngine.ValidateAny(f);// result = true// Only validate against rules with the matching keyvarresult=ruleEngine.ValidateAny(f,"1");// result = true