Skip to content

Nesting Rules

Arif Yayalar (@ayayalar) edited this page Apr 12, 2019 · 4 revisions

Rules can nest other rule(s).

Recommended for creating family of rules, logical groups, etc.

Must be configured in the Initialize method.
Use Configuration.InvokeNestedRulesFirst to invoke nested rule(s) before the containing rule.
Example
class QualifiesForFreeShipping: Rule<Order>
{   
    public override void Initialize()
    {
        // Nested rule(s) will be invoked first.
        Configuration.InvokeNestedRulesFirst = true; // default is false

        // Add nested rule(s)
        AddRule(new AmountGreaterThan50Dollars());

       // If you use DI
       // AddRule<AmountGreaterThan50Dollars>();
    }

    public override IRuleResult Invoke() => 
        new RuleResult { Result = ruleResult };        
}
class TotalGreaterThan50Dollars: Rule<Order>
{   
    public override IRuleResult Invoke()
    {
        if (Model.Total > 50m) Model.FreeShipping = true;           
        
        return null;
    }
}
Model
class Order
{
    public int Id { get; set; }
    public decimal Total { get; set; }
    public bool FreeShipping { get; set; }
}

Note that only QualifiesForFreeShipping rule is passed to RuleEngine since AmountGreaterThan50Dollars rule is nested and automatically included.

var ruleEngine = RuleEngine<Order>.GetInstance(order);
    ruleEngine.AddRule(new QualifiesForFreeShipping()) 
    // If you have DI, ruleEngine.AddRule<QualifiesForFreeShipping>();
    ruleEngine.Execute()