Skip to main content
Version: Next

Quick Start

This example defines two rules for an order, checks one of them, and then checks both together.

1. Define a rule. Derive from BaseBusinessRule and supply a code, a message and the condition. A rule is broken when IsBroken() returns true. Write the condition that describes the violation, not the valid state.

OrderRules.cs
using Masterly.BusinessRules;

// Order and Customer are your own domain classes.
// Here Order.Items is a List<OrderLine> and Customer.IsActive is a bool.
public sealed class OrderMustHaveItemsRule : BaseBusinessRule
{
private readonly Order _order;

public OrderMustHaveItemsRule(Order order)
{
_order = order;
}

public override string Code => "ORDER.NO_ITEMS";

public override string Message => "An order must contain at least one item.";

public override bool IsBroken() => _order.Items.Count == 0;
}

public sealed class CustomerMustBeActiveRule : BaseBusinessRule
{
private readonly Customer _customer;

public CustomerMustBeActiveRule(Customer customer)
{
_customer = customer;
}

public override string Code => "CUSTOMER.INACTIVE";

public override string Message => "The customer account must be active.";

public override bool IsBroken() => !_customer.IsActive;
}

2. Check one rule. IsBroken() answers the question. Check() throws a BusinessRuleValidationException when the rule is broken and does nothing when it passes.

Check one rule
// order comes from your application
OrderMustHaveItemsRule rule = new OrderMustHaveItemsRule(order);

bool isBroken = rule.IsBroken();

rule.Check();

3. Check several rules. BusinessRuleChecker.CheckAll evaluates every rule you pass. If any are broken, it throws one exception that lists all of them.

Check several rules
// order and customer come from your application
try
{
BusinessRuleChecker.CheckAll(
new OrderMustHaveItemsRule(order),
new CustomerMustBeActiveRule(customer));
}
catch (BusinessRuleValidationException exception)
{
foreach (BusinessRuleResult broken in exception.BrokenRules)
{
Console.WriteLine($"{broken.Code} ({broken.Severity}): {broken.Message}");
}
}

With an empty order and an inactive customer, this prints:

Console output
ORDER.NO_ITEMS (Error): An order must contain at least one item.
CUSTOMER.INACTIVE (Error): The customer account must be active.

Next steps