返回顶部
首页 > 资讯 > 精选 >如何在C#中使用RulesEngine规则引擎
  • 305
分享到

如何在C#中使用RulesEngine规则引擎

2023-06-06 14:06:01 305人浏览 薄情痞子
摘要

今天就跟大家聊聊有关如何在C#中使用RulesEngine规则引擎,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。简介RulesEngine是微软推出的规则引擎,规则引擎在很多企业开发

今天就跟大家聊聊有关如何在C#中使用RulesEngine规则引擎,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

简介

RulesEngine是微软推出的规则引擎,规则引擎在很多企业开发中有所应用,是处理经常变动需求的一种优雅的方法。个人任务,规则引擎适用于以下的一些场景:

  • 输入输出类型数量比较固定,但是执行逻辑经常变化;

  • switch条件经常变化,复杂switch语句的替代;

  • 会变动的,具有多种条件或者规则的业务逻辑;

  • 规则自由度不要求特别高的场景。(这种情况建议使用脚本引擎)

RulesEngine的规则使用JSON进行存储,通过lambda表达式方式表述规则(Rules)。

安装很方便,直接使用nuget进行安装:

install-pacakge RulesEngine

规则定义

需要有Rules,有WorkflowName,然后还有一些属性。

[ {  "WorkflowName": "Discount",  "Rules": [   {    "RuleName": "GiveDiscount10",    "SuccessEvent": "10",    "ErrORMessage": "One or more adjust rules failed.",    "ErrorType": "Error",    "RuleExpressionType": "LambdaExpression",    "Expression": "input1.country == \"india\" AND input1.loyalityFactor <= 2 AND input1.totalPurchasesToDate >= 5000 AND input2.totalOrders > 2 AND input3.noOfVisitsPerMonth > 2"   }  ] }]

除了标准的RuleExpressionType,还可以通过定义Rules嵌套多个条件,下面是Or逻辑。

{"RuleName": "GiveDiscount30NestedOrExample","SuccessEvent": "30","ErrorMessage": "One or more adjust rules failed.","ErrorType": "Error","Operator": "OrElse","Rules":[  {  "RuleName": "IsLoyalAndHasGoodSpend",  "ErrorMessage": "One or more adjust rules failed.",  "ErrorType": "Error",  "RuleExpressionType": "LambdaExpression",  "Expression": "input1.loyalityFactor > 3 AND input1.totalPurchasesToDate >= 50000 AND input1.totalPurchasesToDate <= 100000"  },  {  "RuleName": "OrHasHighNumberOfTotalOrders",  "ErrorMessage": "One or more adjust rules failed.",  "ErrorType": "Error",  "RuleExpressionType": "LambdaExpression",  "Expression": "input2.totalOrders > 15"  }]}

示例

可以从官方的代码库中下载示例,定义了上述规则,就可以直接开始用了。示例描述了这么一个应用场景:

根据不同的客户属性,提供不同的折扣。由于销售的情况变化较快,提供折扣的规则也需要经常变动。因此比较适用于规则引擎。

public void Run(){  Console.WriteLine($"Running {nameof(BasicDemo)}....");  //创建输入  var basicInfo = "{\"name\": \"hello\",\"email\": \"abcy@xyz.com\",\"creditHistory\": \"good\",\"country\": \"canada\",\"loyalityFactor\": 3,\"totalPurchasesToDate\": 10000}";  var orderInfo = "{\"totalOrders\": 5,\"recurringitems\": 2}";  var telemetryInfo = "{\"noOfVisitsPerMonth\": 10,\"percentageOfBuyingToVisit\": 15}";  var converter = new ExpandoObjectConverter();  dynamic input1 = jsonConvert.DeserializeObject<ExpandoObject>(basicInfo, converter);  dynamic input2 = JsonConvert.DeserializeObject<ExpandoObject>(orderInfo, converter);  dynamic input3 = JsonConvert.DeserializeObject<ExpandoObject>(telemetryInfo, converter);  var inputs = new dynamic[]    {      input1,      input2,      input3    };  //加载规则  var files = Directory.GetFiles(Directory.GetCurrentDirectory(), "Discount.json", SearchOption.AllDirectories);  if (files == null || files.Length == 0)    throw new Exception("Rules not found.");  var fileData = File.ReadAllText(files[0]);  var workflowRules = JsonConvert.DeserializeObject<List<WorkflowRules>>(fileData);  //初始化规则引擎  var bre = new RulesEngine.RulesEngine(workflowRules.ToArray(), null);  string discountOffered = "No discount offered.";  //执行规则  List<RuleResultTree> resultList = bre.ExecuteAllRulesAsync("Discount", inputs).Result;  //处理结果  resultList.OnSuccess((eventName) => {    discountOffered = $"Discount offered is {eventName} % over MRP.";  });  resultList.OnFail(() => {    discountOffered = "The user is not eligible for any discount.";  });  Console.WriteLine(discountOffered);}

输入

输入一般来说是IEnumerable<dynamic>或者是匿名类型,上面实例展示的是由json反序列化形成的dynamic类型,对于程序生成的数据,使用匿名类型更加方便。

var nestedInput = new {        SimpleProp = "simpleProp",        NestedProp = new {          SimpleProp = "nestedSimpleProp",          ListProp = new List<ListItem>          {            new ListItem            {              Id = 1,              Value = "first"            },            new ListItem            {              Id = 2,              Value = "second"            }          }        }      };

命名空间

和脚本引擎一样,默认规则引擎只能访问System的命名空间。如果需要使用到稍微复杂一些的类型,可以自己定义类型或者函数。比如定义一个这样的函数:

public static class Utils{  public static bool CheckContains(string check, string valList)  {    if (String.IsNullOrEmpty(check) || String.IsNullOrEmpty(valList))      return false;    var list = valList.Split(',').ToList();    return list.Contains(check);  }}

需要使用的时候,先将类传递给RulesEngine:

var reSettingsWithCustomTypes = new ReSettings { CustomTypes = new Type[] { typeof(Utils) } };var engine = new RulesEngine.RulesEngine(workflowRules.ToArray(), null, reSettingsWithCustomTypes);

然后就可以直接在表达式中使用了。

"Expression": "Utils.CheckContains(input1.country, \"india,usa,canada,France\") == true"

规则参数

默认情况下,规则的输入使用的是类似input1 input2这样的形式,如果想直观一点,可以使用RuleParameter来进行封装具体的参数类型。

RuleParameter ruleParameter = new RuleParameter("NIP", nestedInput);var resultList = bre.ExecuteAllRulesAsync(workflow.WorkflowName, ruleParameter).Result;

本地变量

如果表达式比较复杂的情况下,可以使用本地变量来进行分段处理,这对调试来说会比较方便。

本地变量的关键字为localParams,可以将中间的内容简单理解成var name = expression

{    "name": "allow_access_if_all_mandatory_trainings_are_done_or_access_isSecure",    "errorMessage": "Please complete all your training(s) to get access to this content or access it from a secure domain/location.",    "errorType": "Error",    "localParams": [     {      "name": "completedSecurityTrainings",      "expression": "MasterSecurityComplainceTrainings.Where(Status.Equals(\"Completed\", StrinGComparison.InvariantCultureIgnoreCase))"     },     {      "name": "completedProjectTrainings",      "expression": "MasterProjectComplainceTrainings.Where(Status.Equals(\"Completed\", StringComparison.InvariantCultureIgnoreCase))"     },     {      "name": "isRequestAccessSecured",      "expression": "UserRequestDetails.Location.Country == \"India\" ? ((UserRequestDetails.Location.City == \"Bangalore\" && UserRequestDetails.Domain=\"xxxx\")? true : false):false"     }    ],    "expression": "(completedSecurityTrainings.Any() && completedProjectTrainings.Any()) || isRequestAccessSecured "   }

看完上述内容,你们对如何在C#中使用RulesEngine规则引擎有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注编程网精选频道,感谢大家的支持。

--结束END--

本文标题: 如何在C#中使用RulesEngine规则引擎

本文链接: https://lsjlt.com/news/247296.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 如何在C#中使用RulesEngine规则引擎
    今天就跟大家聊聊有关如何在C#中使用RulesEngine规则引擎,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。简介RulesEngine是微软推出的规则引擎,规则引擎在很多企业开发...
    99+
    2023-06-06
  • .NET RulesEngine(规则引擎)的使用详解
    目录RulesEngine 概述如何使用表达树内使用扩展方法多对象组合条件如何实现的?成功失败事件总结一次偶然的机会,让我拿出RulesEngine去完成一个业务,对于业务来说主要是...
    99+
    2024-04-02
  • SpringBoot2中如何整合Drools规则引擎
    本文小编为大家详细介绍“SpringBoot2中如何整合Drools规则引擎”,内容详细,步骤清晰,细节处理妥当,希望这篇“SpringBoot2中如何整合Drools规则引擎”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习...
    99+
    2023-06-08
  • Java规则引擎easy-rules如何理解
    Java规则引擎easy-rules如何理解,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。最近在思考一个基于规则进行挑选的技术重构,想通过规则引擎进行实现,借着...
    99+
    2023-06-22
  • 如何理解Java规则引擎Apache Camel 2.9.1
    本篇文章为大家展示了如何理解Java规则引擎Apache Camel 2.9.1,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Apache Camel 2.9.1 修复了109个bug。Apache...
    99+
    2023-06-17
  • jquery验证引擎funcCall仅在规则时不起作用
    jQuery Validation 插件中的 `funcCall` 方法可以用于执行自定义的验证函数。该方法可以在规则中使用,也可以...
    99+
    2023-09-17
    jquery
  • 如何在PHP中使用模板引擎?
    随着网站的不断发展,许多开发人员开始使用模板引擎来更方便地管理和呈现网站内容。PHP作为一种非常流行的网站开发语言,也提供了许多模板引擎供开发者选择,例如Smarty、Twig和Blade等。在本篇文章中,我们将介绍如何在PHP中使用模板引...
    99+
    2023-05-14
    使用 PHP 模板引擎
  • c++中if elseif使用规则
    c++ 中 if-else if 语句的使用规则为:语法:if (条件1) { // 执行代码块 1} else if (条件 2) { // 执行代码块 2}// ...else ...
    99+
    2024-05-14
    c++
  • 如何在MySQL中使用C#编写自定义存储引擎
    如何在MySQL中使用C#编写自定义存储引擎摘要:MySQL是一个流行的关系型数据库管理系统,提供了许多内置的存储引擎,诸如InnoDB、MyISAM等。然而,有时候我们需要自定义存储引擎来满足特定的需求。本文将介绍如何使用C#编写自定义存...
    99+
    2023-10-22
    MySQL C# 存储引擎
  • js的潜在规则如何使用
    这篇“js的潜在规则如何使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“js的潜在规则如何使用”文章吧。为什么开发中建议使...
    99+
    2023-07-05
  • CMS与搜索引擎的潜规则:如何让您的网站在搜索结果中胜出
    CMS 确实可以为网站优化带来一些挑战,但这些挑战并不是不可克服的。事实上,通过采取一些简单的步骤,您可以确保您的 CMS 网站在搜索引擎中表现良好。 首先,您需要选择一个对搜索引擎友好的 CMS。有一些 CMS 特别适合搜索引擎优化,...
    99+
    2024-02-02
    CMS 网站优化 搜索引擎排名
  • 如何在C++中使用STL关联式容器自定义排序规则
    如何在C++中使用STL关联式容器自定义排序规则?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。1) 使用函数对象自定义排序规则#include <iostrea...
    99+
    2023-06-06
  • MongoDB中如何使用inMemory存储引擎
    本篇文章为大家展示了MongoDB中如何使用inMemory存储引擎,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。一、MongoDB的存储引擎概述存储引擎(Stor...
    99+
    2024-04-02
  • Mysql中如何使用MERGE存储引擎
    本篇文章为大家展示了Mysql中如何使用MERGE存储引擎,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。MERGE 存储引擎把一组 MyISAM 数据表当做一个逻辑...
    99+
    2024-04-02
  • C#中Razor模板引擎简单使用
    目录引用使用Razor模板引擎语法1、简介:2、原理:3、语法规则:使用视图引擎可以完成一些需要定制化内容格式的问题,比如邮件模板。 引用 install-package Razor...
    99+
    2024-04-02
  • C#中Razor模板引擎怎么使用
    这篇文章主要讲解了“C#中Razor模板引擎怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C#中Razor模板引擎怎么使用”吧!使用视图引擎可以完成一些需要定制化内容格式的问题,比如...
    99+
    2023-06-29
  • c++中if elseif使用规则是什么
    在C++中,使用if else if的语法规则如下: if (condition1) { // do something }...
    99+
    2024-04-02
  • 如何在MySQL中使用C#编写自定义存储引擎和触发器
    如何在MySQL中使用C#编写自定义存储引擎和触发器引言:MySQL是一种非常流行的关系型数据库管理系统,它提供了许多内置存储引擎和触发器来满足各种需求。然而,有时候我们需要根据特定需求自定义存储引擎和触发器。本文将介绍如何在MySQL中使...
    99+
    2023-10-22
    MySQL C# 触发器 存储引擎
  • MySQL中索引基础知识及使用规则
    目录 一.InnoDB索引 二.B+树 三.聚集索引和辅助索引 四.索引实战 五.索引操作与规则 重建索引 索引覆盖 最左前缀原则 索引下推 用索引和用索引快速定位却别 六.普通索引和唯一索引如何选择 前提 普通索引和唯一...
    99+
    2020-03-29
    MySQL中索引基础知识及使用规则
  • Mysql中复合索引使用规则有哪些
    这篇文章主要介绍了Mysql中复合索引使用规则有哪些,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。 联合索引验证:从左向右发挥作用索引:(...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作