-
Notifications
You must be signed in to change notification settings - Fork 7
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. |
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;
}
}
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()
Synchronous Rules |
Asynchronous Rules |
Parallel Rules |
Reactive Rules |
Proactive Rules |
ExceptionHandler Rules |