首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >有没有人有动态NRules的工作示例?

有没有人有动态NRules的工作示例?
EN

Stack Overflow用户
提问于 2021-01-15 02:24:37
回答 1查看 1.3K关注 0票数 1

我正在寻找一个动态NRules的工作示例。实际上,我希望在记事本文件中编写规则,并希望在运行时读取它们。

我已经在网上找了4天了,但什么也没找到。

任何帮助都是值得欣赏的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-16 08:06:19

NRules主要定位为在C#中编写规则并将其编译为程序集的规则引擎。还有一个配套的项目https://github.com/NRules/NRules.Language,它定义了一个用于表达规则的文本领域特定语言(称为Rule#)。它的功能不如C# DSL完整,但可能就是你想要的。

在C#中,您仍然有一个项目可以从文件系统或DB加载文本规则,并驱动规则引擎。您将使用https://www.nuget.org/packages/NRules.RuleSharp包将文本规则解析为规则模型,并使用https://www.nuget.org/packages/NRules.Runtime将规则模型编译为可执行形式并运行规则。

给定一个域模型:

代码语言:javascript
运行
复制
namespace Domain
{
    public class Customer
    {
        public string Name { get; set; }
        public string Email { get; set; }
    }
}

并给出一个包含名为MyRuleFile.txt的规则的文本文件

代码语言:javascript
运行
复制
using Domain;

rule "Empty Customer Email"
when
    var customer = Customer(x => string.IsNullOrEmpty(x.Email));
    
then
    Console.WriteLine("Customer email is empty. Customer={0}", customer.Name);

以下是规则驱动程序代码的示例:

代码语言:javascript
运行
复制
var repository = new RuleRepository();
repository.AddNamespace("System");

//Add references to any assembly that the rules are using, e.g. the assembly with the domain model
repository.AddReference(typeof(Console).Assembly);
repository.AddReference(typeof(Customer).Assembly);

//Load rule files
repository.Load(@"MyRuleFile.txt");

//Compile rules 
var factory = repository.Compile();

//Create a rules session
var session = factory.CreateSession();

//Insert facts into the session
session.Insert(customer);

//Fire rules
session.Fire();

输出:

代码语言:javascript
运行
复制
Customer email is empty. Customer=John Do
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65724803

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档