在 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());
}
}
换句话说,上面的两个示例都只创建了一个与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());
}
}
更新:如果你想连接条件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());
}
}