4

我正在寻找一些可以处理这种情况的引擎:

我有一个订单对象,附有一个客户对象。
规则:
如果 order.customer.id = 186 和 order.industry = 23 那么 order.price = 100

我找到了 NxBRE,但这似乎有点矫枉过正?

对于这种情况,其他人在做什么?只是硬编码还是使用Eval?

4

3 回答 3

3

大约两年前我也遇到过这个难题,因为它足够简单,不想走火入魔,而且时间限制我最终构建了一些使用自定义逻辑解释来分析 ==,例如,!=,>,等,使用 Linq 和策略模式作为规则评估引擎的基础

尽管如果您了解 Windows Workflow Foundation,那么显然您可以利用其规则引擎而无需实际使用 WF

于 2013-06-14T15:06:56.270 回答
1

我也遇到过类似的情况,并考虑构建自己的引擎而不是使用现有的引擎,因为当我当前的逻辑发生任何变化或继续使用新的理由时,这将是一个巨大的痛苦。如果我们了解引擎是如何工作的,我们对任何逻辑都是开放的,最好的事情是我们可以构建解决方案来找到局部和全局最优!

请参阅下面的链接,其中勺子为引擎提供了帮助并帮助我创建了新引擎!

点击这里启动

于 2014-03-19T06:12:05.303 回答
0

如果您正在寻找一个更简单的版本并想像这样编写代码......

    [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

于 2015-01-22T22:24:35.257 回答