在 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
and匹配的规则,B
如果这两个事实都匹配,那么X
andY
方法都会被执行。
如果您希望这是两个独立的规则,则将这些不同的 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());
}
}