基于RulesEngine的业务规则实现
规则引擎由推理引擎发展而来,是一种嵌入在应用程序中的组件,实现了将业务决策从应用程序代码中分离出来,并使用预定义的语义模块编写业务决策。接受数据输入,解释业务规则,并根据业务规则做出业务决策。比较常见的业务规则引擎有Drools、VisualRules 和iLog。这里介绍另外一个C#开源工具RulesEngine。下面通过一个例子来他如何使用。
1 项目结构
在RulesEngine源代码中添加一个RulesEngineDemo的窗体应用程序,然后引用需要的类库,如下图所示:
2 订单等实体类定义
这里用订单的场景来用规则引擎处理折扣的业务逻辑:
public class Order
{
public double amount;
public double num;
public double discount;
public double afteramount;
public DateTime datetime;
public List<items> ItemLists;
public string maker;//购买人
public string wfprocess;//审批人
public string wfprocessname;//审批人
public string memo;//备注 public override string ToString()
{
string res = string.Format("折扣={0},金额={1},审批人={2}({4}),折后金额={3}", discount, amount, wfprocess, afteramount,wfprocessname);
return res;
}
}
//用户
public class Emp
{
public string id;
public string leader;
public string name;
}
//明细
public class items
{
public string productid;
public string productname;
public double price;
public double num;
public double discount;
public double amount;
public double afteramount; }
3 窗体定义
下面我们创建一个订单明细的窗体,用来修改金额等数据,用来测试业务规则是否正常运行:、
public partial class FrmOrder : Form
{
public FrmOrder()
{
InitializeComponent();
dgvOrder = this.dataGridView1;
} public DataGridView dgvOrder;
private void FrmOrder_Load(object sender, EventArgs e)
{
this.dataGridView1.Rows.Add(new object[] { "", "p1", "", "", "", "","","01.01" });
this.dataGridView1.Rows.Add(new object[] { "", "p2", "", "", "", "", "", "01.01" }); } private void 保存SToolStripButton_Click(object sender, EventArgs e)
{
this.Hide();
}
}
然后我们定义一个主界面来定义规则和调用处理逻辑:
using RulesEngine;
using RulesEngine.BooEvaluator;
public partial class Form1 : Form
{ DataGridView dgvOrder = null;
public Form1()
{
InitializeComponent();
} private void Form1_Load(object sender, EventArgs e)
{
this.dataGridView1.Rows.Add(new object[] {"return (订单.金额>200)",@"
订单.折扣=0.9;
订单.审批人=""admin"";
订单.折后金额=订单.金额*订单.折扣;
订单.备注 = ""规则引擎产生"";
return true;" });
this.dataGridView1.Rows.Add(new object[] {"return (订单.金额<=200 且 订单.金额>100)",@"
订单.折扣=0.8;
订单.折后金额=订单.金额*订单.折扣;
订单.备注 = ""规则引擎产生"";
return true;" }); this.dataGridView1.Rows.Add(new object[] {"return (订单.金额<=100 且 订单.金额>0)",@"
订单.折扣=1.0;
订单.折后金额=订单.金额*订单.折扣;
订单.备注 = ""规则引擎产生"";
return true;" }); }
//run
private void 保存SToolStripButton_Click(object sender, EventArgs e)
{ DslRuleTests test = new DslRuleTests();
test.Setup(); //test.EvaluateRules(); var order = test.EvaluateRules(this.dataGridView1, dgvOrder);
this.txtResults.Text = order.ToString(); } private void toolStripButton1_Click(object sender, EventArgs e)
{
FrmOrder frm = new FrmOrder(); frm.ShowDialog(); dgvOrder = frm.dgvOrder;
}
} public class DslRuleTests
{
private BooLangEvaluator evaluator; private List<Emp> listEmp = new List<Emp>(); public void Setup()
{
var dslEngineStorage = new DslEngineStorage(); evaluator = new BooLangEvaluator(dslEngineStorage); listEmp.Add(new Emp { id = "", leader ="" ,name="jack"});
listEmp.Add(new Emp { id = "01.01", leader = "", name = "smith" });
listEmp.Add(new Emp { id = "01.01.01", leader = "01.01", name = "john" }); }
//审批处理
private void SP(Order o)
{ foreach (Emp emp in listEmp)
{
if (emp.id == o.maker)
{
o.wfprocess = emp.leader;
o.wfprocessname = getName(o.wfprocess);
}
} }
//获取职工姓名
private string getName(string id)
{
foreach (Emp emp in listEmp)
{
if (emp.id == id)
{ return emp.name;
}
}
return "";
}
//求和
private void SumAmount(Order o)
{
var sum = o.ItemLists.AsQueryable().Sum(x => x.amount);
o.amount = sum;
}
//解析规则脚本
public Order EvaluateRules(DataGridView dgv,DataGridView dgvOrder)
{
Order order =new Order { memo = "", maker = "01.01", discount = , datetime = DateTime.Now };
order.ItemLists = new List<items>();
foreach (DataGridViewRow dr in dgvOrder.Rows)
{
if (dr.Cells[].Value != null)
{
var item = new items
{
productid = dr.Cells[].Value.ToString(),
productname = dr.Cells[].Value.ToString(),
price = double.Parse(dr.Cells[].Value.ToString()),
num = double.Parse(dr.Cells[].Value.ToString()),
amount = double.Parse(dr.Cells[].Value.ToString()),
discount = double.Parse(dr.Cells[].Value.ToString()),
afteramount = double.Parse(dr.Cells[].Value.ToString()) }; order.ItemLists.Add(item);
}
} SumAmount(order);
SP(order);
string strDslStatement="";
string strDslActivity = "";
EvaluatorAccessPoint.DslConditionEvaluator = evaluator; foreach (DataGridViewRow dr in dgv.Rows)
{ strDslStatement = dr.Cells[].Value.ToString()
.Replace("订单", "this")
.Replace("金额", "amount")
.Replace("且", "and")
.Replace("或", "or");
strDslActivity = dr.Cells[].Value.ToString()
.Replace("折扣", "discount")
.Replace("折后金额", "afteramount")
.Replace("金额", "amount")
.Replace("订单", "this")
.Replace("备注", "memo")
.Replace("审批人", "wfprocessname")
.Replace("且", "and")
.Replace("或", "or"); var conditionRule = new DslCondition { DslStatement = strDslStatement }; var rule = new ActivityRule(conditionRule, new DslActivity
{
DslStatement = strDslActivity
}); var result = rule.Evaluate(order);
if (result)
{
//break;
return order; } }
return null; } }
4 结果展示
运行代码,界面如下:
基于RulesEngine的业务规则实现的更多相关文章
- BizTalk动手实验(九)业务规则引擎使用
1 课程简介 通过本课程熟悉业务规则引擎(BRE)的使用(本环境为Windows 2008 32位操作系统环境 + Visual Studio 2010 + BizTalk 210) 2 准备工作 1 ...
- pfSense配置基于时间的防火墙规则
基于时间的规则允许防火墙规则在指定的日期和/或时间范围内激活.基于时间的规则与任何其他规则的功能相同,只是它们在预定时间之外的规则集中实际上不存在. 基于时间的规则逻辑处理基于时间的规则时,调度计划确 ...
- 理解DDoS防护本质:基于资源较量和规则过滤的智能化系统
本文由 网易云发布. 随着互联网生态逐渐形成,DDoS防护已经成为互联网企业的刚需要求,网易云安全(易盾)工程师根据DDoS的方方面面,全面总结DDoS的攻防对抗. 1.什么是DDoS DDoS全称 ...
- SpringBoot2 整合 Drools规则引擎,实现高效的业务规则
本文源码:GitHub·点这里 || GitEE·点这里 一.Drools引擎简介 1.基础简介 Drools是一个基于java的规则引擎,开源的,可以将复杂多变的规则从硬编码中解放出来,以规则脚本的 ...
- (十五)整合 Drools规则引擎,实现高效的业务规则
整合 Drools规则引擎,实现高效的业务规则 1.Drools引擎简介 1.1 规则语法 2.SpringBoot整合Drools 2.1 项目结构 2.2 核心依赖 2.3 配置文件 3.演示案例 ...
- Asp.net 面向接口可扩展框架之业务规则引擎扩展组件
随着面向接口可扩展框架的继续开发,有些功能开发出现了"瓶颈",有太多的东西要写死才好做.但写死的代码扩展性是非常的不好,迷茫中寻找出入... 进而想到我以前开发的好几个项目,都已有 ...
- Dynamics CRM 2015Online Update1 new feature之 通过业务规则清空字段的值
自2013引入业务规则后很多的功能就不需要通过javascript来实现,业务人员直接通过配置就能解决.那随着版本的更新业务规则的功能也越来越强大,从之前很单纯的逻辑到后面的if..else,相信后面 ...
- Dynamics CRM2013 业务规则的新建、激活与删除
CRM2013的一个新的feature叫做业务规则,一些页面的简单的显示隐藏的控制.字段是否必填.有条件的锁定字段.错误提示等等,以前都是需要些脚本代码实现现在只需通过业务规则做一些简单的配置就可以达 ...
- Ckrule业务规则管理系统简介
1. 简述 Ckrule业务规则管理系统(BRMS)是一个集成的应用程序存储.管理.执行和测试的平台,允许组织定义.部署.监控和维护运营系统使用的各种复杂决策逻辑.Ckrule BRMS 独立于核 ...
随机推荐
- PHP将富文本编辑后的内容,去除样式图片等只保留txt文本内容
1.从数据库读取富文本内容样式如下: <p style=";text-indent: 0;padding: 0;line-height: 26px"><span ...
- javase基础复习攻略《九》
本篇将为大家总结JAVA中的线程机制,谈到线程,大家一定会问线程和进程有什么区别?刚接触进程时我也有这样的疑问,今天就为大家简单介绍一下进程和线程.进程(Process)是计算机中的程序关于某数据集合 ...
- 通过js获得选择文件的绝对路径
<form name="thisform" method="get" action="test.jsp" id="thisf ...
- G++ 参数介绍(转载)
g++参数介绍 From: http://www.cnblogs.com/lidan/archive/2011/05/25/2239517.html gcc and g++分别是gnu的c & ...
- Windows Azure Service Bus (3) 队列(Queue) 使用VS2013开发Service Bus Queue
<Windows Azure Platform 系列文章目录> 在之前的Azure Service Bus中,我们已经介绍了Service Bus 队列(Queue)的基本概念. 在本章中 ...
- Electro桌面应用开发之HelloWorld
简介 Electron (http://http://electron.atom.io)提供了一个使用Node.js进行桌面应用开发的环境. 本文介绍了一个基于Electron的HelloWorld ...
- HT for Web自定义3D模型的WebGL应用
有不少朋友询问<HTML5 Web 客户端五种离线存储方式汇总>文章例子的3D表计模型是如何生成的,这个例子是通过导入3dmax设计好的表计模型,然后通过obj格式导入到HT for We ...
- 实现ASP.NET无刷新下载并提示下载完成
先上代码,后面再进行说明. 以下是前端代码: <%@ Page Language="C#" AutoEventWireup="true" CodeBehi ...
- TreeView 自定义显示checkbox
本项目需要对TreeView进行定制,要求比较简单,主要要求如下: Winform中TreeView控件默认只支持所有级别的CheckBox显示或者不显示,不能控制制定Level的树节点显示 效果如下 ...
- 【C#】递归搜索指定目录下的指定项目(文件或目录)
---------------更新:201411201121--------------- 主要更新说明:将原bool recurse参数改为int depth,这样可以指定递归深度,而不是笼统的是否 ...