У меня есть приложение 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»), как это должно бытьреализован в файле правил?