我正在创建一个业务规则引擎,并计划向用户提供NRules框架。
https://github.com/NRules/NRules
但是我想知道是否可以从数据库本身生成规则。
我有一个数据库表,其中保存了一些规则。
年龄> 20
名=='约翰'
条件可以是多个,即使属性名称可以更改,也不会硬编码。
我浏览了一篇博客文章,该文章的内容相同,但使用表达式树。
http://coding-time.blogspot.in/2011/07/how-to-implement-rule-engine-in-c.html
我可以使用NRules框架实现相同的功能吗(如果可以),在这里我可以找到一些代码示例。
我正在尝试找出 BRE NRules 并得到一些有效的示例,但很难匹配集合。
IEnumerable<Order> orders = null;
When()
.Match<IEnumerable<Order>>(o => o.Where(c => c.Cancelled).Count() >= 3)
.Collect<Order>(() => orders, o => o.Cancelled);
Then()
.Do(ctx => orders.ToList().ForEach(o => o.DoSomething()));
Run Code Online (Sandbox Code Playgroud)
基本上我想要的是,如果有 3 个订单被取消,那么执行一些操作。但我似乎无法在集合上获得匹配,单个变量确实有效。
该程序:
var order3 = new Order(123458, customer, 2, 20.0);
var order4 = new Order(123459, customer, 1, 10.0);
var order5 = new Order(123460, customer, 1, 11.0);
order3.Cancelled = true;
order4.Cancelled = true;
order5.Cancelled = true;
session.Insert(order3);
session.Insert(order4);
session.Insert(order5);
session.Fire();
Run Code Online (Sandbox Code Playgroud)
我在这里做错了什么?
NRules SimpleRule的代码定义了以下规则:
public class PreferredCustomerDiscountRule : Rule
{
public override void Define()
{
Customer customer = null;
IEnumerable<Order> orders = null;
When()
.Match<Customer>(() => customer, c => c.IsPreferred)
.Collect<Order>(() => orders,
o => o.Customer == customer,
o => o.IsOpen,
o => !o.IsDiscounted);
Then()
.Do(ctx => ApplyDiscount(orders, 10.0))
.Do(ctx => LogOrders(orders))
.Do(ctx => orders.ToList().ForEach(ctx.Update));
}
...
}
Run Code Online (Sandbox Code Playgroud)
我想知道为什么条件是单独的pareameters而不是仅使用&&运算符,即以下将具有相同的效果?
public class PreferredCustomerDiscountRule : Rule
{
public override void Define()
{
Customer customer = null;
IEnumerable<Order> orders = null;
When()
.Match<Customer>(() => customer, …Run Code Online (Sandbox Code Playgroud) 我刚刚发现了.NET的NRules。我想创建一个规则,以防止在字段/属性值无效时构造对象。例如,给定以下类:
public class Customer
{
public string Name { get; private set; }
public bool IsPreferred { get; set; }
public Customer(string name)
{
Name = name;
}
}
Run Code Online (Sandbox Code Playgroud)
我希望创建一个规则,当“名称”为null或为空时,该规则将引发异常,从而取消对象创建以及生成用户定义的消息:必须指定客户名称。
可以使用NRules完成此操作吗?
我想根据前一个规则的结果运行一个规则。如何使用前向链接实现此功能?我不想为每个规则创建不同的类对象来实现前向链接。
在此示例中,仅为这一规则创建了一个 InstantDiscount 对象以实现前向链接。
public class PreferredCustomerDiscountRule : Rule
{
public override void Define()
{
Customer customer = null;
IEnumerable<Order> orders = null;
Double total = Double.NaN;
When()
.Match<Customer>(() => customer, c => c.IsPreferred)
.Query(() => orders, x => x
.Match<Order>(
o => o.Customer == customer,
o => o.IsOpen)
.Collect())
.Let(() => total, () => orders.Sum(x => x.Amount))
.Having(() => total > 1000);
Then()
.Yield(_ => new InstantDiscount(customer, total * 0.05));
}
}
public class PrintInstantDiscountRule : Rule
{
public …Run Code Online (Sandbox Code Playgroud)