C# 规则引擎

根据不同的城市以及购买数量,加载json文件,得到优化折扣,运行结果:

  

DisCount.json

复制代码
[
  {
    "WorkflowName": "Discount",
    "Rules": [
      {
        "RuleName": "rule1",
        "SuccessEvent": "9",
        "ErrorMessage": "One or more adjust rules failed.",
        "ErrorType": "Error",
        "RuleExpressionType": "LambdaExpression",
        "Expression": "input1.city == \"厦门\" AND input2.totalOrders >=0"
      },
      {
        "RuleName": "rule2",
        "SuccessEvent": "8",
        "ErrorMessage": "One or more adjust rules failed.",
        "ErrorType": "Error",
        "RuleExpressionType": "LambdaExpression",
        "Expression": "input1.city == \"泉州\" AND input2.totalOrders >=1"
      }
    ]
  }
]
复制代码

 

复制代码
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
using RulesEngine.Extensions;
using RulesEngine.Models;
using System;
using System.Collections.Generic;
using System.Dynamic;
using System.IO;
using System.Windows.Forms;

namespace RulesEngineDemo
{
    public partial class MainForm : Form
    {
        // NuGet -> RulesEngine

        public MainForm()
        {
            InitializeComponent();

            cmbCity.SelectedIndex = 0;
        } 

        private void btnSubmit_Click(object sender, EventArgs e)
        {
            string city = cmbCity.Text;
            string count = txtCount.Text.Trim();

            var basicInfo = "{\"city\": \"" + city +"\"}";
            var orderInfo = "{\"totalOrders\": " + count + "}";

            var converter = new ExpandoObjectConverter();

            dynamic input1 = JsonConvert.DeserializeObject<ExpandoObject>(basicInfo, converter);
            dynamic input2 = JsonConvert.DeserializeObject<ExpandoObject>(orderInfo, converter);

            var inputs = new dynamic[]
            {
              input1,
              input2
            };

            // 加载规则
            var files = Directory.GetFiles(Directory.GetCurrentDirectory(), "Discount.json", SearchOption.AllDirectories);
            if (files == null || files.Length == 0)
            {
                lblMsg.Text = "Rules not found.";
                return;
            }

            var fileData = File.ReadAllText(files[0]);
            var workflowRules = JsonConvert.DeserializeObject<List<WorkflowRules>>(fileData);

            // 初始化规则引擎
            var bre = new RulesEngine.RulesEngine(workflowRules.ToArray(), null);

            string note = "没有折扣";

            // 执行规则
            List<RuleResultTree> resultList = bre.ExecuteAllRulesAsync("Discount", inputs).Result;

            // 处理结果
            resultList.OnSuccess((eventName) =>
            {
                note = $"打 {eventName} 折";
            });

            resultList.OnFail(() =>
            {
                note = "不打折";
            });

            lblMsg.Text = note;
        }
    }
}
复制代码

 

posted @   CHHC  阅读(912)  评论(0编辑  收藏  举报
(评论功能已被禁用)
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
历史上的今天:
2020-06-29 1. 云停车 (开篇)
点击右上角即可分享
微信分享提示