nrules

How to use Rule# to author NRules that consume multiple class objects


I wish to use Rule# to author rules in my application using the NRules engine. Since I would like users to author their rules at runtime, I wish to know if it is possible to do something like this

When()
            .Match<Customer>(() => customer)
            .Exists<Order>(o => o.Customer == customer, o => o.PercentDiscount > 0.0);
Then()
            .Do(_ => customer.NotifyAboutDiscount());

using Rule# ?

The example here https://github.com/NRules/NRules.Language shows me how to author a rule or rules with a single object. However, I would like to use different class objects in one rule as in the example above.

I can't find a more detailed documentation on Rule# ...


Solution

  • It's important to note that Rule# (aka NRules.Language) is not feature complete, compared to the internal rules DSL. The best place to see all examples of what's currently supported in Rule# is the integration tests: https://github.com/NRules/NRules.Language/blob/develop/src/NRules.RuleSharp/NRules.RuleSharp.IntegrationTests/RuleCompilerTests.cs

    Specifically, for your example, assuming your domain model contains Customer and Order types with the corresponding properties and methods, the rule will look like this:

    rule "Notify About Discount"
    when
        var customer = Customer();
        exists Order(o => o.Customer == customer, o => o.PercentDiscount > 0.0);
        
    then
        customer.NotifyAboutDiscount();