首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NRules -组织规则

NRules -组织规则
EN

Stack Overflow用户
提问于 2021-02-02 06:54:36
回答 1查看 254关注 0票数 0

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

我有一个规则,它检查3个条件(事实匹配),is flagA = false,inputA =值列表中的一个,inputB =单个值。当全部为true时,将flagA设置为true。我让这条规则起作用了,然后想添加第二条规则。

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

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

我看过".Or“选项,但我不太擅长fluent,无法弄清楚它在做什么。

谢谢你的帮助,图姆

EN

回答 1

Stack Overflow用户

发布于 2021-02-03 12:47:41

在NRules中,从NRules.Fluent.Dsl.Rule继承的类的实例是一条规则。您可以将多个规则类放在一个.cs文件或不同的文件中,这并不重要-每个类仍然是一个单独的规则。

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

所以:

代码语言:javascript
复制
public class Rule1: Rule
{
    public override void Define()
    {
        When()
            .Match<A>();
        Then()
            .Do(_ => X());

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

完全相同于

代码语言:javascript
复制
public class Rule1: Rule
{
    public override void Define()
    {
        When()
            .Match<A>()
            .Match<B>();
        Then()
            .Do(_ => X())
            .Do(_ => Y());
    }
}

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

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

代码语言:javascript
复制
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());
    }
}

更新:如果你想用OR连接条件AB,你可以像下面这样做。如果为((A OR B) AND C),则规则将在此处触发

代码语言:javascript
复制
public class Rule1: Rule
{
    public override void Define()
    {
        When()
            .Or(x => x
                .Match<A>()
                .Match<B>())
            .Match<C>();
        Then()
            .Do(_ => Z());
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66001294

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档