如何使用NRules语言中的NRules表达方法(例如查询,操作)在rules(.rul)文件中实现复杂的实体验证规则

时间:2019-07-11 10:14:38

标签: nrules

我有一个MVC应用程序,我试图在其中使用nrules设置实体验证,因此我已经使用nrules-language创建了规则文件来对每个实体进行验证(例如ContactValidation.rul)。

NRules提供了实现复杂匹配表达式的接口方法,但是我不知道NRules语言中的语法会给我与ILeftHandSideExpression中存在的方法相同的行为(方法-全部,存在,存在,匹配,查询等) )和IRruHandSideExpression(方法-动作,执行,产量等)接口(以nrules语言显示)。

当前我的规则文件如下-

使用Form.Sample.Models;

使用系统;

使用System.Web.Mvc;

规则“联系验证”

何时

var实体= Contact(x => string.IsNullOrEmpty(x.Contact_FirstName),x => string.IsNullOrEmpty(x.Contact_LastName),x => string.IsNullOrEmpty(x.Contact_Email),x => string.IsNullOrEmpty (x.Contact_Phone));

var model = ModelStateDictionary();

然后

model.AddModelError(“ Contact”,“ Validation Failed”);

我正在通过-

启动应用程序期间加载所有规则
public static ISessionFactory _compiledRuleFactory = null;

    public static void LoadAllRulesInReposiotory()
    {
        var repository = new RuleRepository();
        repository.AddReference(typeof(Contact).Assembly);
        repository.AddReference(typeof(ModelStateDictionary).Assembly);
        var ruleStream = GetAllRuleStream();

        foreach (var item in ruleStream)
        {
            repository.LoadText(item);
        }

        var factory = repository.Compile();
        _compiledRuleFactory = factory;
    }


public static IEnumerable<string> GetAllRuleStream()
    {
        string[] filePaths = Directory.GetFiles(Path.Combine(HttpRuntime.AppDomainAppPath, "Rules"), "*.rul");
        List<string> fileStreams = new List<string>();

        foreach (var item in filePaths)
        {
            FileStream fs = new FileStream(item, FileMode.Open, FileAccess.Read);

            StreamReader reader = new StreamReader(fs);
            string text = reader.ReadToEnd();
            fileStreams.Add(text);
        }

        return fileStreams;
    }

我的控制器看起来-

public ActionResult Create(Contact contact)
    {
//get static rule factory from global.asax
        var ruleFactory = _compiledRuleFactory;
        var session = ruleFactory.CreateSession();

        session.Insert(contact);
        session.Insert(ModelState);

        session.Fire();

        if (ModelState.IsValid)
        {
            db.Contacts.Add(contact);
            db.SaveChanges();
            return RedirectToAction("Index");
        }

        return View(contact);
    }

规则文件已加载并执行了规则,但是由于无法在Nrules语言中使用上述方法(查询,操作等),因此我无法添加复杂的验证行为。

此外,我想公开暴露实体验证失败的属性,并为每个属性提供独立的验证消息(例如,“ Contact_FirstName失败验证”,而不是常规的“验证失败”消息),应如何在规则文件?

0 个答案:

没有答案