Как использовать методы выражения NRules (например, Query, Action) на языке NRules для реализации правил проверки сложных сущностей в файле правил (.rul) - PullRequest
0 голосов
/ 11 июля 2019

У меня есть приложение MVC, в котором я пытаюсь настроить проверку сущности с помощью nrules, поэтому я создал файл правил с использованием nrules-языка для проверки сущности (например, ContactValidation.rul).

NRules предлагает методы интерфейса для реализации выражения сложного совпадения, однако я не знаю синтаксиса в языке NRules, который дал бы мне поведение, эквивалентное методам, присутствующим в ILeftHandSideExpression (методы - All, And, Exists, Match, Query и т. Д.) И интерфейсы IRightHandSideExpression (методы - Action, Do, Yield и т. Д.) На языке nrules.

В настоящее время мой файл правил выглядит как -

с использованием Form.Sample.Models;

с использованием System;

с использованием System.Web.Mvc;

правило "Проверка контактов"

при

var entity = 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) (x.Contact_Phone)*

var model = ModelStateDictionary ();

затем

model.AddModelError («Контакт», «Ошибка проверки»);

Я загружаю все правила во время запуска приложения через -

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);
    }

Файл правила загружается и правило выполняется, однако я не могу добавить сложное поведение проверки, так как нет документации / примеров для использования вышеупомянутых методов (ЗапросДействие и т. Д.) На нрульском языке.

Кроме того, я хочу предоставить доступ к свойствам, которые не прошли проверку сущности, и предоставить независимое сообщение проверки для каждого свойства (например, «Contact_FirstName fail validation» вместо общего сообщения «Validation failed»), как это должно бытьреализован в файле правил?

...