Advertisement
Guest User

Untitled

a guest
May 29th, 2015
231
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.46 KB | None | 0 0
  1. using System;
  2. using System.Linq;
  3. using NRules;
  4. using NRules.Diagnostics;
  5. using NRules.Fluent;
  6. using NRules.Fluent.Dsl;
  7.  
  8. namespace ConsoleApplication4
  9. {
  10. class Program
  11. {
  12. static void Main(string[] args)
  13. {
  14. var ruleRepository = new RuleRepository();
  15. ruleRepository.Load(spec => spec.From(
  16. typeof(TestRule),
  17. typeof(TestRule2),
  18. typeof(TestRule3)));
  19.  
  20. var sessionFactory = ruleRepository.Compile();
  21.  
  22. var session = sessionFactory.CreateSession();
  23. session.AttachLogs();
  24.  
  25. session.Insert(new SalesOrder
  26. {
  27. TotalPrice = 100,
  28. ChargeShipping = true
  29. });
  30.  
  31. session.Fire();
  32.  
  33. var salesOrder = session.Query<SalesOrder>().First();
  34. Console.WriteLine("Shipping={0}", salesOrder.ChargeShipping);
  35. Console.WriteLine("TotalPrice={0}", salesOrder.TotalPrice);
  36. }
  37. }
  38.  
  39. public class SalesOrder
  40. {
  41. public decimal TotalPrice { get; set; }
  42. public bool ChargeShipping { get; set; }
  43.  
  44. public SalesOrder()
  45. {
  46. ChargeShipping = true;
  47. }
  48.  
  49. public void FreeShipping()
  50. {
  51. ChargeShipping = false;
  52. }
  53.  
  54. public void ApplyDiscount()
  55. {
  56. TotalPrice = TotalPrice * 0.9m;
  57. }
  58.  
  59. public void ApplyShipping()
  60. {
  61. ChargeShipping = true;
  62. }
  63.  
  64. public override string ToString()
  65. {
  66. return string.Format("SalesOrder[P={0},S={1}]", TotalPrice, ChargeShipping);
  67. }
  68. }
  69.  
  70. [Name("FreeShipping")]
  71. public class TestRule : Rule
  72. {
  73. public override void Define()
  74. {
  75. SalesOrder salesOrder = null;
  76.  
  77. When()
  78. .Match(() => salesOrder, so => so.TotalPrice >= 100, so => so.ChargeShipping);
  79.  
  80. Then()
  81. .Do(cxt => salesOrder.FreeShipping())
  82. .Do(cxt => cxt.Update(salesOrder));
  83. }
  84. }
  85.  
  86. [Name("ApplyShipping")]
  87. public class TestRule3 : Rule
  88. {
  89. public override void Define()
  90. {
  91. SalesOrder salesOrder = null;
  92.  
  93. When()
  94. .Match(() => salesOrder, so => so.TotalPrice < 100, so => !so.ChargeShipping);
  95.  
  96. Then()
  97. .Do(cxt => salesOrder.ApplyShipping())
  98. .Do(cxt => cxt.Update(salesOrder));
  99. }
  100. }
  101.  
  102. [Name("ApplyDiscount")]
  103. public class TestRule2 : Rule
  104. {
  105. public override void Define()
  106. {
  107. SalesOrder salesOrder = null;
  108.  
  109. When()
  110. .Match(() => salesOrder, so => so.TotalPrice >= 50);
  111.  
  112. Then()
  113. .Do(cxt => salesOrder.ApplyDiscount())
  114. .Do(cxt => cxt.Update(salesOrder));
  115. }
  116. }
  117.  
  118. public static class RuleLog
  119. {
  120. public static void AttachLogs(this ISession session)
  121. {
  122. session.Events.FactInsertingEvent += FactInserting;
  123. session.Events.FactUpdatingEvent += FactUpdating;
  124. session.Events.ActivationCreatedEvent += ActivationCreated;
  125. session.Events.ActivationDeletedEvent += ActivationDeleted;
  126. session.Events.RuleFiringEvent += RuleFiring;
  127. session.Events.RuleFiredEvent += RuleFired;
  128. }
  129.  
  130. private static void FactInserting(object sender, WorkingMemoryEventArgs e)
  131. {
  132. Console.WriteLine("Inserting {0}", e.Fact.Value);
  133. }
  134.  
  135. private static void FactUpdating(object sender, WorkingMemoryEventArgs e)
  136. {
  137. Console.WriteLine("Updating {0}", e.Fact.Value);
  138. }
  139.  
  140. static void ActivationCreated(object sender, AgendaEventArgs e)
  141. {
  142. Console.WriteLine("Activated {0} {1}", e.Rule.Name, string.Join(",", e.Facts.Select(f => f.Value)));
  143. }
  144.  
  145. static void ActivationDeleted(object sender, AgendaEventArgs e)
  146. {
  147. Console.WriteLine("Deactivated {0} {1}", e.Rule.Name, string.Join(",", e.Facts.Select(f => f.Value)));
  148. }
  149.  
  150. private static void RuleFiring(object sender, AgendaEventArgs e)
  151. {
  152. Console.WriteLine("Firing {0} {1}", e.Rule.Name, string.Join(",", e.Facts.Select(f => f.Value)));
  153. }
  154.  
  155. private static void RuleFired(object sender, AgendaEventArgs e)
  156. {
  157. Console.WriteLine("Fired {0} {1}", e.Rule.Name, string.Join(",", e.Facts.Select(f => f.Value)));
  158. }
  159. }
  160. }
  161.  
  162. //Output:
  163. /*
  164. Inserting SalesOrder[P=100,S=True]
  165. Activated FreeShipping SalesOrder[P=100,S=True]
  166. Activated ApplyDiscount SalesOrder[P=100,S=True]
  167. Firing FreeShipping SalesOrder[P=100,S=True]
  168. Updating SalesOrder[P=100,S=False]
  169. Deactivated FreeShipping SalesOrder[P=100,S=False]
  170. Activated ApplyDiscount SalesOrder[P=100,S=False]
  171. Fired FreeShipping SalesOrder[P=100,S=False]
  172. Firing ApplyDiscount SalesOrder[P=100,S=False]
  173. Updating SalesOrder[P=90.0,S=False]
  174. Activated ApplyDiscount SalesOrder[P=90.0,S=False]
  175. Activated ApplyShipping SalesOrder[P=90.0,S=False]
  176. Fired ApplyDiscount SalesOrder[P=90.0,S=False]
  177. Firing ApplyDiscount SalesOrder[P=90.0,S=False]
  178. Updating SalesOrder[P=81.00,S=False]
  179. Activated ApplyDiscount SalesOrder[P=81.00,S=False]
  180. Activated ApplyShipping SalesOrder[P=81.00,S=False]
  181. Fired ApplyDiscount SalesOrder[P=81.00,S=False]
  182. Firing ApplyShipping SalesOrder[P=81.00,S=False]
  183. Updating SalesOrder[P=81.00,S=True]
  184. Activated ApplyDiscount SalesOrder[P=81.00,S=True]
  185. Deactivated ApplyShipping SalesOrder[P=81.00,S=True]
  186. Fired ApplyShipping SalesOrder[P=81.00,S=True]
  187. Firing ApplyDiscount SalesOrder[P=81.00,S=True]
  188. Updating SalesOrder[P=72.900,S=True]
  189. Activated ApplyDiscount SalesOrder[P=72.900,S=True]
  190. Fired ApplyDiscount SalesOrder[P=72.900,S=True]
  191. Firing ApplyDiscount SalesOrder[P=72.900,S=True]
  192. Updating SalesOrder[P=65.6100,S=True]
  193. Activated ApplyDiscount SalesOrder[P=65.6100,S=True]
  194. Fired ApplyDiscount SalesOrder[P=65.6100,S=True]
  195. Firing ApplyDiscount SalesOrder[P=65.6100,S=True]
  196. Updating SalesOrder[P=59.04900,S=True]
  197. Activated ApplyDiscount SalesOrder[P=59.04900,S=True]
  198. Fired ApplyDiscount SalesOrder[P=59.04900,S=True]
  199. Firing ApplyDiscount SalesOrder[P=59.04900,S=True]
  200. Updating SalesOrder[P=53.144100,S=True]
  201. Activated ApplyDiscount SalesOrder[P=53.144100,S=True]
  202. Fired ApplyDiscount SalesOrder[P=53.144100,S=True]
  203. Firing ApplyDiscount SalesOrder[P=53.144100,S=True]
  204. Updating SalesOrder[P=47.8296900,S=True]
  205. Deactivated ApplyDiscount SalesOrder[P=47.8296900,S=True]
  206. Fired ApplyDiscount SalesOrder[P=47.8296900,S=True]
  207. Shipping=True
  208. TotalPrice=47.8296900
  209. */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement