我正在寻找一些可以处理这种情况的引擎:
我有一个订单对象,附有一个客户对象。
规则:
如果 order.customer.id = 186 和 order.industry = 23 那么 order.price = 100
我找到了 NxBRE,但这似乎有点矫枉过正?
对于这种情况,其他人在做什么?只是硬编码还是使用Eval?
我正在寻找一些可以处理这种情况的引擎:
我有一个订单对象,附有一个客户对象。
规则:
如果 order.customer.id = 186 和 order.industry = 23 那么 order.price = 100
我找到了 NxBRE,但这似乎有点矫枉过正?
对于这种情况,其他人在做什么?只是硬编码还是使用Eval?
大约两年前我也遇到过这个难题,因为它足够简单,不想走火入魔,而且时间限制我最终构建了一些使用自定义逻辑解释来分析 ==,例如,!=,>,等,使用 Linq 和策略模式作为规则评估引擎的基础
尽管如果您了解 Windows Workflow Foundation,那么显然您可以利用其规则引擎而无需实际使用 WF
我也遇到过类似的情况,并考虑构建自己的引擎而不是使用现有的引擎,因为当我当前的逻辑发生任何变化或继续使用新的理由时,这将是一个巨大的痛苦。如果我们了解引擎是如何工作的,我们对任何逻辑都是开放的,最好的事情是我们可以构建解决方案来找到局部和全局最优!
请参阅下面的链接,其中勺子为引擎提供了帮助并帮助我创建了新引擎!
如果您正在寻找一个更简单的版本并想像这样编写代码......
[TestMethod]
public void GreaterThanRule_WhenGreater_ResultsTrue()
{
// ARRANGE
int threshold = 5;
int actual = 10;
// ACT
var integerRule = new IntegerGreaterThanRule();
integerRule.Initialize(threshold, actual);
var integerRuleEngine = new RuleEngine<int>();
integerRuleEngine.Add(integerRule);
var result = integerRuleEngine.MatchAll();
// ASSERT
Assert.IsTrue(result);
}
……或者像这样……
[TestMethod]
public void GreaterThanRule_WhenGreater_ResultsTrue()
{
// ARRANGE
int threshold = 5;
int actual = 10;
// ACT
var integerRule = new IntegerGreaterThanRule(threshold);
var integerRuleEngine = new RuleEngine<int>();
integerRuleEngine.ActualValue = actual;
integerRuleEngine.Add(integerRule);
// Get the result
var result = integerRuleEngine.MatchAll();
// ASSERT
Assert.IsTrue(result);
}
...然后也许看看我的博客,在那里我慢慢地建立了一个规则引擎。 http://www.duanewingett.info/2015/01/21/SimpleCRuleEnginePart1TheRuleEngine.aspx