0

为 NRules 组织规则时,是否需要在文件中仅包含 1 个 When/Then 组?

我有一条规则查看 3 个条件(事实匹配),flagA = false,inputA = 值列表之一,inputB = 单个值。当全部为真时,将 flagA 设置为真。我得到了那个工作,然后想添加第二条规则。

第二条规则是当 flagA 为 false 且 flagB 为 true 时,将 flagA 设置为 true。

这两个规则是否需要位于单独的 .cs 文件中,或者它们可以放在一个文件中。

我查看了“.Or”选项,但我不够流利,无法弄清楚它在做什么。

谢谢你的帮助,汤姆

4

1 回答 1

0

在 NRules 中,继承自的类的实例NRules.Fluent.Dsl.Rule是一个规则。您可以将多个规则类放在一个 .cs 文件或不同的文件中,没关系 - 每个类仍然是一个单独的规则。

在该规则类中,您通常只指定WhenThen部分一次。如果您多次指定它们,所有条件仍将使用and组组合成一个集合。动作也将被合并到一个集合中。

所以:

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());
    }
}

换句话说,上面的两个示例都只创建了一个与Aand匹配的规则,B如果这两个事实都匹配,那么XandY方法都会被执行。

如果您希望这是两个独立的规则,则将这些不同的 When/Then 部分放入不同的规则类中。

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());
    }
}

更新:如果你想连接条件AB一个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());
    }
}
于 2021-02-03T04:47:40.987 回答