c# - 这是在 NRules 中定义规则的正确方法吗?

标签 c# asp.net rule-engine rete nrules

public class AllowAtleastOneCountryRule : Rule
{
    public override void Define()
    {
        Profile profile = null;

        string str = @"At least one country has to be defined as 'permitted'";


        bool enabled = AllRules.GetDict()[str];//Checks if the rule is enabled


        When()
            .Match<FundProfile>(() => productProfile)
            .Exists<FundProfile>(p => enabled, p => RuleViolation(p));


        Then()
            .Do(_ => profile .DisplayError(str));


    }


    bool RuleViolation(FundProfile pp)
    {
        try
        {


            if (pp.DefaultMode.Equals(Helper.DefaultModes.Allow.ToString()))
            {
                if (pp.ListOfCountries.Count < pp.TotalCountries)//Okay
                    return false;
                else//Rule violation
                    return true;
            }
            else//Deny
            {
                if (pp.ListOfCountries.Count > 0)//Okay
                    return false;
                else//Rule violation
                    return true;
            }

        }
        catch(Exception e)
        {
            throw new InvalidRuleException(e.Message);
        }

    }
}

如您所见,我正在使用规则调用另一个方法来评估几个条件。我觉得我没有在这里使用 Rete 算法的全部功能,因为我正在为自己进行预评估。 谁能指导我如何处理这个问题?

最佳答案

您的代码看起来不错,您有一个复杂的规则并将其封装。

按照文档和示例,您可以实现一个优雅的解决方案。

实现 complex logic使用 .Query 而不是 .Exists,将封装的逻辑转换为 linq 或 lambda 表达式。 然后申请DSL Extension ,使您的代码更具可读性。

关于c# - 这是在 NRules 中定义规则的正确方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35756983/

相关文章:

java - Drools 规则模板 - 第一次调用比后续调用慢 1000 倍

c# - 另一台机器上的目录 - 登录凭据

c# - 我怎样才能得到 gridview 行数

c# - 如何在自定义服务器控件 asp 中使用 .resx 和 .resource 文件?

c# - 如何删除Linq to Entity中的多条记录?

java - java & ruby​​ 中的规则引擎(建议我一个好方法)

java - 您如何分析 Drools 应用程序?

c# - 是否有必要在winform控件上调用dispose?

c# - 如何使用 DataContractJsonSerializer 序列化匿名类型

c# - 付款日期为 UTC