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.
IKernel ruleEngine = new Kernel();
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.
public interface IRule
{
string Key { get; set; }
string Expression { get; set; }
}
//...
void AddRule(IRule rule);
//...
String expressions can be simply against the object passed to the engine.
Creating a fact:
var fact = new Person {Age = 37, Income = 45000, NumberOfChildren = 3};
Validating the fact:
var result = ruleEngine.Validate(fact, "(f.Age > 3 && f.Income > 100000) || f.NumberOfChildren > 5");
// result = false
More than one expreession can be added to the engine
var rules = new List<Rule>
{
new Rule {Key = "1", Expression = "(f.Age > 3 && f.Income < 50000) || f.NumberOfChildren > 2"},
new Rule {Key = "2", Expression = "(f.Age > 3 && f.Income > 100000) || f.NumberOfChildren > 5"}
};
ruleEngine.AddRules(rules);
// Validate against all rules when no key passed
var result = ruleEngine.ValidateAll(f);
// result = false
// Only validate against rules with the matching key
var result = ruleEngine.ValidateAll(f, "1");
// result = true
The calls are the same as the case of validate all, however it returns true if any case is true.
var rules = new List<Rule>
{
new Rule {Key = "1", Expression = "(f.Age > 3 && f.Income < 50000) || f.NumberOfChildren > 2"},
new Rule {Key = "2", Expression = "(f.Age > 3 && f.Income > 100000) || f.NumberOfChildren > 5"}
};
ruleEngine.AddRules(rules);
// Validate against all rules when no key passed
var result = ruleEngine.ValidateAny(f);
// result = true
// Only validate against rules with the matching key
var result = ruleEngine.ValidateAny(f, "1");
// result = true