Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Linq;
- using NRules;
- using NRules.Diagnostics;
- using NRules.Fluent;
- using NRules.Fluent.Dsl;
- namespace ConsoleApplication4
- {
- class Program
- {
- static void Main(string[] args)
- {
- var ruleRepository = new RuleRepository();
- ruleRepository.Load(spec => spec.From(
- typeof(TestRule),
- typeof(TestRule2),
- typeof(TestRule3)));
- var sessionFactory = ruleRepository.Compile();
- var session = sessionFactory.CreateSession();
- session.AttachLogs();
- session.Insert(new SalesOrder
- {
- TotalPrice = 100,
- ChargeShipping = true
- });
- session.Fire();
- var salesOrder = session.Query<SalesOrder>().First();
- Console.WriteLine("Shipping={0}", salesOrder.ChargeShipping);
- Console.WriteLine("TotalPrice={0}", salesOrder.TotalPrice);
- }
- }
- public class SalesOrder
- {
- public decimal TotalPrice { get; set; }
- public bool ChargeShipping { get; set; }
- public SalesOrder()
- {
- ChargeShipping = true;
- }
- public void FreeShipping()
- {
- ChargeShipping = false;
- }
- public void ApplyDiscount()
- {
- TotalPrice = TotalPrice * 0.9m;
- }
- public void ApplyShipping()
- {
- ChargeShipping = true;
- }
- public override string ToString()
- {
- return string.Format("SalesOrder[P={0},S={1}]", TotalPrice, ChargeShipping);
- }
- }
- [Name("FreeShipping")]
- public class TestRule : Rule
- {
- public override void Define()
- {
- SalesOrder salesOrder = null;
- When()
- .Match(() => salesOrder, so => so.TotalPrice >= 100, so => so.ChargeShipping);
- Then()
- .Do(cxt => salesOrder.FreeShipping())
- .Do(cxt => cxt.Update(salesOrder));
- }
- }
- [Name("ApplyShipping")]
- public class TestRule3 : Rule
- {
- public override void Define()
- {
- SalesOrder salesOrder = null;
- When()
- .Match(() => salesOrder, so => so.TotalPrice < 100, so => !so.ChargeShipping);
- Then()
- .Do(cxt => salesOrder.ApplyShipping())
- .Do(cxt => cxt.Update(salesOrder));
- }
- }
- [Name("ApplyDiscount")]
- public class TestRule2 : Rule
- {
- public override void Define()
- {
- SalesOrder salesOrder = null;
- When()
- .Match(() => salesOrder, so => so.TotalPrice >= 50);
- Then()
- .Do(cxt => salesOrder.ApplyDiscount())
- .Do(cxt => cxt.Update(salesOrder));
- }
- }
- public static class RuleLog
- {
- public static void AttachLogs(this ISession session)
- {
- session.Events.FactInsertingEvent += FactInserting;
- session.Events.FactUpdatingEvent += FactUpdating;
- session.Events.ActivationCreatedEvent += ActivationCreated;
- session.Events.ActivationDeletedEvent += ActivationDeleted;
- session.Events.RuleFiringEvent += RuleFiring;
- session.Events.RuleFiredEvent += RuleFired;
- }
- private static void FactInserting(object sender, WorkingMemoryEventArgs e)
- {
- Console.WriteLine("Inserting {0}", e.Fact.Value);
- }
- private static void FactUpdating(object sender, WorkingMemoryEventArgs e)
- {
- Console.WriteLine("Updating {0}", e.Fact.Value);
- }
- static void ActivationCreated(object sender, AgendaEventArgs e)
- {
- Console.WriteLine("Activated {0} {1}", e.Rule.Name, string.Join(",", e.Facts.Select(f => f.Value)));
- }
- static void ActivationDeleted(object sender, AgendaEventArgs e)
- {
- Console.WriteLine("Deactivated {0} {1}", e.Rule.Name, string.Join(",", e.Facts.Select(f => f.Value)));
- }
- private static void RuleFiring(object sender, AgendaEventArgs e)
- {
- Console.WriteLine("Firing {0} {1}", e.Rule.Name, string.Join(",", e.Facts.Select(f => f.Value)));
- }
- private static void RuleFired(object sender, AgendaEventArgs e)
- {
- Console.WriteLine("Fired {0} {1}", e.Rule.Name, string.Join(",", e.Facts.Select(f => f.Value)));
- }
- }
- }
- //Output:
- /*
- Inserting SalesOrder[P=100,S=True]
- Activated FreeShipping SalesOrder[P=100,S=True]
- Activated ApplyDiscount SalesOrder[P=100,S=True]
- Firing FreeShipping SalesOrder[P=100,S=True]
- Updating SalesOrder[P=100,S=False]
- Deactivated FreeShipping SalesOrder[P=100,S=False]
- Activated ApplyDiscount SalesOrder[P=100,S=False]
- Fired FreeShipping SalesOrder[P=100,S=False]
- Firing ApplyDiscount SalesOrder[P=100,S=False]
- Updating SalesOrder[P=90.0,S=False]
- Activated ApplyDiscount SalesOrder[P=90.0,S=False]
- Activated ApplyShipping SalesOrder[P=90.0,S=False]
- Fired ApplyDiscount SalesOrder[P=90.0,S=False]
- Firing ApplyDiscount SalesOrder[P=90.0,S=False]
- Updating SalesOrder[P=81.00,S=False]
- Activated ApplyDiscount SalesOrder[P=81.00,S=False]
- Activated ApplyShipping SalesOrder[P=81.00,S=False]
- Fired ApplyDiscount SalesOrder[P=81.00,S=False]
- Firing ApplyShipping SalesOrder[P=81.00,S=False]
- Updating SalesOrder[P=81.00,S=True]
- Activated ApplyDiscount SalesOrder[P=81.00,S=True]
- Deactivated ApplyShipping SalesOrder[P=81.00,S=True]
- Fired ApplyShipping SalesOrder[P=81.00,S=True]
- Firing ApplyDiscount SalesOrder[P=81.00,S=True]
- Updating SalesOrder[P=72.900,S=True]
- Activated ApplyDiscount SalesOrder[P=72.900,S=True]
- Fired ApplyDiscount SalesOrder[P=72.900,S=True]
- Firing ApplyDiscount SalesOrder[P=72.900,S=True]
- Updating SalesOrder[P=65.6100,S=True]
- Activated ApplyDiscount SalesOrder[P=65.6100,S=True]
- Fired ApplyDiscount SalesOrder[P=65.6100,S=True]
- Firing ApplyDiscount SalesOrder[P=65.6100,S=True]
- Updating SalesOrder[P=59.04900,S=True]
- Activated ApplyDiscount SalesOrder[P=59.04900,S=True]
- Fired ApplyDiscount SalesOrder[P=59.04900,S=True]
- Firing ApplyDiscount SalesOrder[P=59.04900,S=True]
- Updating SalesOrder[P=53.144100,S=True]
- Activated ApplyDiscount SalesOrder[P=53.144100,S=True]
- Fired ApplyDiscount SalesOrder[P=53.144100,S=True]
- Firing ApplyDiscount SalesOrder[P=53.144100,S=True]
- Updating SalesOrder[P=47.8296900,S=True]
- Deactivated ApplyDiscount SalesOrder[P=47.8296900,S=True]
- Fired ApplyDiscount SalesOrder[P=47.8296900,S=True]
- Shipping=True
- TotalPrice=47.8296900
- */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement