基于RulesEngine的业务规则实现
2016-03-11 10:51
357 查看
规则引擎由推理引擎发展而来,是一种嵌入在应用程序中的组件,实现了将业务决策从应用程序代码中分离出来,并使用预定义的语义模块编写业务决策。接受数据输入,解释业务规则,并根据业务规则做出业务决策。比较常见的业务规则引擎有Drools、VisualRules 和iLog。这里介绍另外一个C#开源工具RulesEngine。下面通过一个例子来他如何使用。
1 项目结构
在RulesEngine源代码中添加一个RulesEngineDemo的窗体应用程序,然后引用需要的类库,如下图所示:
View Code
4 结果展示
运行代码,界面如下:
1 项目结构
在RulesEngine源代码中添加一个RulesEngineDemo的窗体应用程序,然后引用需要的类库,如下图所示:
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 = "01", leader ="00" ,name="jack"}); listEmp.Add(new Emp { id = "01.01", leader = "01", 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 = 1, datetime = DateTime.Now }; order.ItemLists = new List<items>(); foreach (DataGridViewRow dr in dgvOrder.Rows) { if (dr.Cells[0].Value != null) { var item = new items { productid = dr.Cells[0].Value.ToString(), productname = dr.Cells[1].Value.ToString(), price = double.Parse(dr.Cells[2].Value.ToString()), num = double.Parse(dr.Cells[3].Value.ToString()), amount = double.Parse(dr.Cells[4].Value.ToString()), discount = double.Parse(dr.Cells[5].Value.ToString()), afteramount = double.Parse(dr.Cells[6].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[0].Value.ToString() .Replace("订单", "this") .Replace("金额", "amount") .Replace("且", "and") .Replace("或", "or"); strDslActivity = dr.Cells[1].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; } }
View Code
4 结果展示
运行代码,界面如下:
相关文章推荐
- Android消息机制之 Looper、Handler、Message的关系和运行
- ios本地添加提醒事件
- MyEclipse去除网上复制下来的代码带有的行号
- Android实现开机自动运行程序
- Linux中常用命令——查找命令对比分析
- Python使用PIL库实现验证码图片的方法
- layout_marginLeft和layout_marginStart
- 从尾到头打印链表每个节点的值。
- RHEL5.5配置SFTP-ONLY访问
- bzoj1800
- 深度学习与人脸识别系列(6)__利用训练好的vgg模型进行人脸识别(利用摄像头)
- 深度学习与人脸识别系列(5)__vgg人脸识别模型测试
- 【转】Java程序员最常用的8个Java日志框架
- ObjectDataSource控件使用详解
- eclipse 性能调优之内存分配
- 虚拟机跨主机RESIZE和迁移时候报错的问题
- c++第二次上机实验(代码没有输出)
- Jenkins入门系列之——00答疑解惑
- java基础之泛型
- java基础之泛型