【问题标题】:NRules - Organizing RulesNRules - 组织规则
【发布时间】:2021-02-01 22:54:36
【问题描述】:

在组织NRules的规则时,一个文件中是否必须只有1个When/Then组?

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

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

这两个规则需要放在单独的 .cs 文件中还是可以放在一个文件中。

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

感谢您的帮助, 汤姆

【问题讨论】:

    标签: nrules


    【解决方案1】:

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

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

    如果您希望这是两个独立的规则,则将这些不同的 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());
        }
    }
    

    更新: 如果您想将条件ABOR 连接起来,您可以像下面这样操作。如果((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());
        }
    }
    

    【讨论】:

    • 太棒了,这为我清除了那部分。现在,我尝试 2 个规则的原因是我有 2 个条件会触发一个真实的条件。 “.Or”子句让我很困惑。
    • 太好了,这能满足您的需求吗?
    • 有 .OR 在标准的 if 语句中,这种情况类似于:
    • 你是在问如何写一个Or条件?
    • 我更新了答案,包括如何使用 Or 组的说明
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-13
    • 2021-09-20
    • 2019-06-10
    • 1970-01-01
    相关资源
    最近更新 更多