У меня есть вопросы о реализации логического вывода с использованием NRules.
У меня есть следующие вопросы о достижении логического вывода с использованием NRules. Было бы здорово, если бы вы могли предоставить свои входные данные.
Позвольте мне сначала объяснитьсценарий я пытаюсь.Это очень простой, где я создал 2 правила.Первое правило, когда клиент является предпочтительным клиентом, тогда предоставьте скидку 10%.Второе правило: всякий раз, когда применяется скидка, уведомляйте клиента.Здесь я приложил код для примера программы InferenceTest.cs для вашей справки.
Теперь, с выполнением обоих этих правил, поведение, которое я наблюдаю, переходит в бесконечный цикл.Причина в том, что каждый раз, когда объект customer обновляется в первом правиле, он бесконечно выполняет оба правила рекурсивно.Если я явно сделаю условие первого правила таким образом, чтобы во время следующего выполнения оно оценивалось как ложное, то только тогда оно работает нормально.
Теперь вопрос - 1 / Должен ли автор правилапозаботиться о написании условий правила таким образом, чтобы оно не вызывало повторного запуска правила во время выполнения вывода?Это жесткое ограничение?Вероятно, в системе, имеющей большее количество правил, для автора правила может оказаться невозможным рассмотреть все различные правила и затем написать новое правило таким образом, чтобы оно не входило в бесконечный цикл.2 / Является ли установка для тега Repeatability значения false для каждого правила, является наилучшим и рекомендуемым решением в таких сценариях?
public class InferenceTest {
static void Main(string[] args) {
//Load rules
var repository = new NRules.Fluent.RuleRepository();
repository.Load(x => x.From(typeof(PreferredCustomerDiscountRule).Assembly));
//Compile rules
var factory = repository.Compile();
//Create a working session
var session = factory.CreateSession();
//Load domain model
var customer = new Customer("John Doe") { IsPreferred = true };
//Insert facts into rules engine's memory
session.Insert(customer);
//Start match/resolve/act cycle
session.Fire();
Console.ReadLine();
}
}
public class PreferredCustomerDiscountRule : Rule {
public override void Define() {
Customer customer = null;
When()
.Match<Customer>(() => customer, c => c.IsPreferred);
Then()
.Do(ctx => ApplyDiscount(customer, 10.0))
.Do(ctx => ctx.Update(customer));
}
private static void ApplyDiscount(Customer customer, double discount) {
customer.DiscountPercent = discount;
Console.WriteLine("Discount applied----", customer.Name);
}
}
public class DiscountNotificationRule : Rule {
public override void Define() {
Customer customer = null;
When()
.Match<Customer>(() => customer, c => c.DiscountPercent.HasValue);
Then()
.Do(_ => NotifyAboutDiscount(customer));
}
private static void NotifyAboutDiscount(Customer customer) {
Console.WriteLine("---Customer {0} has instant discount of {1}%", customer.Name, customer.DiscountPercent);
}
}
public class Customer {
public string Name { get; private set; }
public bool IsPreferred { get; set; }
public Nullable<double> DiscountPercent { get; internal set; }
public Customer(string name) {
Name = name;
}
}