zoukankan      html  css  js  c++  java
  • .Net规则引擎介绍

    规则引擎

    规则引擎由推理引擎发展而来,是一种嵌入在应用程序中的组件,实现了将业务决策从应用程序代码中分离出来,并使用预定义的语义模块编写业务决策。接受数据输入,解释业务规则,并根据业务规则做出业务决策。

    个人理解

    变化点过于集中在一点,为了适应变化,而给各种场景分别写了各自关于那点的代码逻辑,尽管主要的业务逻辑相同。

    适用点举例

    计算折扣,需要根据客户的积分决定打折点

    工作流具体节点的路由控制

    其他(希望大家补充下,想象力有限...)

    用法

    以计算客户打折点为例:

    我们首先得新建一个规则文件,用来定义各个场景对应的折扣计算方式,如下:

    #region 折扣规则        //这个是规则名称,在C#代码中会使用到这个名称,此处为"折扣规则"
        rule default       //默认规则,必须存在,如果C#代码中指定的子规则名称没有找到,则默认应用default规则(有开关能设置如没有找到子规则是否报错)
            return 1;
        end rule
        rule A公司         //子规则名称,此处为"A公司"
            if(customerScore>=0&&customerScore<100)
                return 1;
            if(customerScore>=100&&customerScore<300)
                return 0.8;
            return 0.5;
        end rule
        rule B公司         //子规则名称,此处为"B公司"
            if(customerScore>=0&&customerScore<100)
                return 0.9;
            if(customerScore>=100&&customerScore<300)
                return 0.7;
            return 0.6;
        end rule
    #endregion

     C#代码中,分几种情况 - 我就想调用默认规则:

    var result = REngine.InvokeAsFloat("折扣规则", REngine.CreateParameter("customerScore", 220));

    我想根据公司名称来调用折扣规则:

    var result1 = REngine.InvokeAsFloat("折扣规则", "A公司", REngine.CreateParameter("customerScore", 220));
    
    var result2 = REngine.InvokeAsFloat("折扣规则", "B公司", REngine.CreateParameter("customerScore", 220));
    
    var companyId="A公司";//这里表示公司名来自变量
    var result3 = REngine.InvokeAsFloat("折扣规则", companyId, REngine.CreateParameter("customerScore", 220));

     很方便,简直太方便了。

    那如果我根据companyId查找的子规则名称不存在,怎么办?我就想要具体的子规则决定规则,而不想要根据默认default规则,那该如何是好?别急,请看:

    <appSettings>
        <add key="REngine.RulefilesPath" value="rules"/>
        <add key="REngine.ThrowExceptionIfNotfoundRule" value="1"/>
      </appSettings>

     如果配置文件中设置了REngine.ThrowExceptionIfNotfoundRule参数为1,则代表如果没有找到具体子规则名,就会报错,不会应用默认default规则

     介绍下REngine的API

    性能

    项目地址

    REngine地址:https://github.com/daibinhua888/REngine

  • 相关阅读:
    FFTW3学习笔记2:FFTW(快速傅里叶变换)中文参考
    小程序中用rich-text来实现ul功能 (代码)
    微信小程序中如何实现列表渲染多层嵌套循环
    小程序中实现选择预览图片同时可以实现长按删除图片的代码
    微信小程序实例:获取当前城市位置及再次授权地理位置的代码实现
    微信小程序实例:实现顶部tab切换以及滑动切换时导航栏会随着移动的效果(代码)
    入门微信小程序直播
    微信小程序之登录态
    微信小程序之本地缓存
    微信小程序之页面路由
  • 原文地址:https://www.cnblogs.com/aarond/p/REngine.html
Copyright © 2011-2022 走看看