NRules — правила организации

При организации правил для NRules необходимо иметь только 1 группу «Когда/Тогда» в файле?

У меня есть одно правило, которое рассматривает 3 условия (совпадения фактов): flagA = false, inputA = одно из списка значений и inputB = одно значение. Когда все верно, установите для флагаA значение true. Я заставил это работать, а затем хотел добавить второе правило.

Второе правило заключается в том, что если флаг A ложен, а флаг B истинен, тогда установите для флага A значение true.

Эти два правила должны быть в отдельных файлах .cs или они могут быть вместе в одном.

Я посмотрел на вариант .Or, но я недостаточно хорошо говорю, чтобы понять, что он делает.

Спасибо за помощь, Том


person TasMot    schedule 01.02.2021    source источник


Ответы (1)


В NRules экземпляр класса, который наследуется от NRules.Fluent.Dsl.Rule, является одним правилом. Вы можете поместить несколько классов правил в один файл .cs или в разные файлы, это не имеет значения — каждый класс по-прежнему является отдельным правилом.

В этом классе правил вы обычно указываете разделы When и Then только один раз. Если вы укажете их несколько раз, все условия все равно будут объединены в один набор с помощью группы and. Действия также будут объединены в единый набор.

So:

public class Rule1: Rule
{
    public override void Define()
    {
        When()
            .Match<A>();
        Then()
            .Do(_ => X());

        When()
            .Match<B>();
        Then()
            .Do(_ => Y());
    }
}

точно такой же, как

public class Rule1: Rule
{
    public override void Define()
    {
        When()
            .Match<A>()
            .Match<B>();
        Then()
            .Do(_ => X())
            .Do(_ => Y());
    }
}

Другими словами, оба приведенных выше примера создают только одно правило, которое соответствует как A, так и B, и если оба этих факта совпадают, то выполняются оба метода X и Y.

Если вы хотите, чтобы это были два независимых правила, поместите эти разные разделы «Когда/Тогда» в разные классы правил.

public class Rule1: Rule
{
    public override void Define()
    {
        When()
            .Match<A>();
        Then()
            .Do(_ => X());
    }
}

public class Rule2: Rule
{
    public override void Define()
    {
        When()
            .Match<B>();
        Then()
            .Do(_ => Y());
    }
}

ОБНОВЛЕНИЕ: Если вы хотите связать условия A и B с OR, вы можете сделать это, как показано ниже. Здесь правило сработает, если ((A OR B) AND C):

public class Rule1: Rule
{
    public override void Define()
    {
        When()
            .Or(x => x
                .Match<A>()
                .Match<B>())
            .Match<C>();
        Then()
            .Do(_ => Z());
    }
}
person Sergiy Nikolayev    schedule 03.02.2021
comment
Круто, это проясняет для меня эту часть. Теперь причина, по которой я пробовал 2 правила, заключается в том, что у меня было 2 условия, которые вызывали бы истинное условие. Предложение .Or меня смутило. - person TasMot; 04.02.2021
comment
Отлично, так это дает вам то, что вам нужно? - person Sergiy Nikolayev; 04.02.2021
comment
Существует .OR В стандартном выражении if этот случай будет выглядеть примерно так: - person TasMot; 04.02.2021
comment
Вы спрашиваете, как написать условие Or? - person Sergiy Nikolayev; 04.02.2021
comment
Я обновил ответ, включая объяснение того, как использовать группу «Или». - person Sergiy Nikolayev; 05.02.2021
comment
Хорошо, спасибо за обновление OR. Я собираюсь пойти попробовать это сейчас в моей реальной системе. - person TasMot; 05.02.2021