在组织NRules的规则时,文件中是否有必要只有1个When/Then组?
我有一个规则,它检查3个条件(事实匹配),is flagA = false,inputA =值列表中的一个,inputB =单个值。当全部为true时,将flagA设置为true。我让这条规则起作用了,然后想添加第二条规则。
第二条规则是,当flagA为false,flagB为true时,将flagA设置为true。
这两个规则是否需要放在单独的.cs文件中,还是可以放在一个文件中。
我看过".Or“选项,但我不太擅长fluent,无法弄清楚它在做什么。
谢谢你的帮助,图姆
发布于 2021-02-03 12:47:41
在NRules中,从NRules.Fluent.Dsl.Rule继承的类的实例是一条规则。您可以将多个规则类放在一个.cs文件或不同的文件中,这并不重要-每个类仍然是一个单独的规则。
在规则类中,通常只需指定一次When和Then部分。如果您多次指定它们,则所有条件仍将使用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());
}
}换句话说,上面的两个示例都只创建了一个同时匹配A和B的规则,如果这两个事实都匹配,则同时执行X和Y方法。
如果您希望这是两个独立的规则,那么将这些不同的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());
}
}更新:如果你想用OR连接条件A和B,你可以像下面这样做。如果为((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());
}
}https://stackoverflow.com/questions/66001294
复制相似问题