zoukankan      html  css  js  c++  java
  • 极其好用好学的规则引擎

    写了个简单的规则引擎,普通情况够用了:

    比如2家公司有各自的利率计算规则,如下:

    在C#方面,没有写在C#的业务逻辑代码中,而是移到了外部规则文件中,如(ACompanyRatePolicy.r):

    rule "Level 1"
        when
            alreadyCostPrice >= 0
            alreadyCostPrice < 100
        then
            rate = 1
    end
    rule "Level 2"
        when
            alreadyCostPrice >= 100
            alreadyCostPrice < 300
        then
            rate = 0.8
    end
    rule "Level 3"
        when
            alreadyCostPrice >= 300
        then
            rate = 0.5
    end

    不同的公司调用不同的Policy定义文件来执行逻辑:

    核心调用代码:

    public class CustomerRateService
        {
            public static decimal CalculateRate(decimal costedAlready, decimal priceThisTime, string rulePolicy)
            {
                using (RuleEngine engine = new RuleEngine(System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Rules")))
                {
                    engine.BindRule("Rating", rulePolicy);   //此处的第一个参数"Rating"是规则组名称,对应的是物理文件夹,方便规则文件的管理和查看
    
                    engine.SetParameter("alreadyCostPrice", costedAlready);
                    engine.SetParameter("thisTimePrice", priceThisTime);
    
                    engine.Process();
    
                    return engine.GetDecimal("rate");
                }
            }
            
        }

    原理比较简单:

    1. 根据规则文件(.r文件)生成js代码
    2. 在C#中嵌入v8引擎执行这段js代码
    3. 获取结果

    代码已经更新到A2D Framework了。

    大家拿去用吧。。。哈哈。

  • 相关阅读:
    核心思想:台积电目前的硬体核心技术/制造人力估计不到1,000人
    忽然懂了:云就是互联网
    Qt https 用户认证authenticationRequired()
    TDD和BDD
    MEF实现设计上的“松耦合”
    跨域调用webapi
    复杂度
    react
    Angularjs里面跨作用域
    Spring.NET程序
  • 原文地址:https://www.cnblogs.com/aarond/p/RuleEngine.html
Copyright © 2011-2022 走看看