Example #1
0
 public ProductPaymentRule()
 {
     //rules should be injected and formed during startup
     _ruleEngine = new RuleEngine <IRuleProduct>();
     _ruleEngine.AddRule(OrderConstants.BookPayment, new BookPaymentRule());
     _ruleEngine.AddRule(OrderConstants.VideoPayment, new VideoPaymentRule());
 }
Example #2
0
 public WithRuleEngine(Action <string> todo)
 {
     _todo = s =>
     {
         Console.WriteLine(s);
         todo(s);
     };
     _engine = new RuleEngine();
     _engine.AddRule <FizzRule>();
     _engine.AddRule <BuzzRule>();
 }
Example #3
0
        public async Task CustomComputeType_OneItem_NotExistsBySql()
        {
            //定义规则
            var rule = new Rule
            {
                Name  = "CustomComputeType_OneItem_NotExistsBySql",
                Items = new List <RuleItem>
                {
                    new RuleItem
                    {
                        RuleItemType = "name",
                        ComputeType  = "NotExistsBySql",
                        Value        = "select 1 from user where userName = @CheckValue;",
                    }
                },
            };
            //添加规则到引擎
            await RuleEngine.Clear();

            await RuleEngine.AddRule(rule);

            //定义事实
            var fact = new Fact {
                { "name", "haha" }
            };
            //运算
            var res = await RuleEngine.Compute(fact);

            Assert.IsNotNull(res);
            Assert.IsTrue(res.Success);
        }
Example #4
0
        public async Task BaseComputeType_OneItem_NotEqualsTo()
        {
            //定义规则
            var rule = new Rule
            {
                Name  = "BaseComputeType_OneItem_NotEqualsTo",
                Items = new List <RuleItem>
                {
                    new RuleItem
                    {
                        RuleItemType = "sex",
                        ComputeType  = BaseComputeType.NotEqualsTo.ToString(),
                        Value        = "man",
                    }
                },
            };
            //添加规则到引擎
            await RuleEngine.Clear();

            await RuleEngine.AddRule(rule);

            //定义事实
            var fact = new Fact {
                { "sex", "women" }
            };
            //运算
            var res = await RuleEngine.Compute(fact);

            Assert.IsNotNull(res);
            Assert.IsTrue(res.Success);
        }
Example #5
0
        public async Task BaseComputeType_OneItem_MoreThan()
        {
            //定义规则
            var rule = new Rule
            {
                Name  = "BaseComputeType_OneItem_MoreThan",
                Items = new List <RuleItem>
                {
                    new RuleItem
                    {
                        RuleItemType = "age",
                        ComputeType  = BaseComputeType.MoreThan.ToString(),
                        Value        = "18",
                    }
                },
            };
            //添加规则到引擎
            await RuleEngine.Clear();

            await RuleEngine.AddRule(rule);

            //定义事实
            var fact = new Fact {
                { "age", "20" }
            };
            //运算
            var res = await RuleEngine.Compute(fact);

            Assert.IsNotNull(res);
            Assert.IsTrue(res.Success);
        }
Example #6
0
        public async Task BaseComputeType_OneItem_NotContain()
        {
            //定义规则
            var rule = new Rule
            {
                Name  = "BaseComputeType_OneItem_NotContain",
                Items = new List <RuleItem>
                {
                    new RuleItem
                    {
                        RuleItemType = "say",
                        ComputeType  = BaseComputeType.NotContain.ToString(),
                        Value        = "Hello World!",
                    }
                },
            };
            //添加规则到引擎
            await RuleEngine.Clear();

            await RuleEngine.AddRule(rule);

            //定义事实
            var fact = new Fact {
                { "say", "Hi" }
            };
            //运算
            var res = await RuleEngine.Compute(fact);

            Assert.IsNotNull(res);
            Assert.IsTrue(res.Success);
        }
 public VideoPaymentRule()
 {
     //rules should be injected and formed during startup
     _ruleEngine = new RuleEngine <List <Guid> >();
     _ruleEngine.AddRule(VideoConstants.LearningToSki, new List <Guid>()
     {
         VideoConstants.LearningToSki, VideoConstants.FirstAid
     });
 }
Example #8
0
 public void Setup()
 {
     _ruleEngineOrder = new RuleEngine <IRuleOrder <IOrder> >();
     _ruleEngineOrder.AddRule(OrderConstants.MembershipPayment, new MembershipPaymentRule()
     {
         OrderType = new MembershipPayment()
     });
     _ruleEngineOrder.AddRule(OrderConstants.MembershipUpgrade, new MembershipPaymentRule()
     {
         OrderType = new MembershipUpgrade()
     });
     _ruleEngineOrder.AddRule(OrderConstants.BookPayment, new ProductPaymentRule()
     {
         OrderType = new BookPayment()
     });
     _ruleEngineOrder.AddRule(OrderConstants.VideoPayment, new ProductPaymentRule()
     {
         OrderType = new VideoPayment()
     });
 }
Example #9
0
        public async Task BaseComputeType_MoreBaseComputeType_MissRule()
        {
            //定义规则
            var rule1 = new Rule
            {
                Name     = "BaseComputeType_MoreBaseComputeType_MissRule",
                Priority = 1,
                Items    = new List <RuleItem>
                {
                    new RuleItem
                    {
                        RuleItemType = "age",
                        ComputeType  = BaseComputeType.LessThan.ToString(),
                        Value        = "15",
                    }
                },
            };
            var rule2 = new Rule
            {
                Name     = "BaseComputeType_MoreBaseComputeType_HitRule2",
                Priority = 0,
                Items    = new List <RuleItem>
                {
                    new RuleItem
                    {
                        RuleItemType = "age",
                        ComputeType  = BaseComputeType.LessThan.ToString(),
                        Value        = "18",
                    }
                },
            };
            //添加规则到引擎
            await RuleEngine.Clear();

            await RuleEngine.AddRule(rule1);

            await RuleEngine.AddRule(rule2);

            //定义事实
            var fact = new Fact {
                { "age", "24" }
            };
            //运算
            var res = await RuleEngine.Compute(fact);

            Assert.IsNotNull(res);
            Assert.IsNull(res.HitRule);
            Assert.IsFalse(res.Success);
            Assert.IsTrue(res.Infos.Any(x => x.MissRuleItemType == "age"));
        }
Example #10
0
        public async Task BaseComputeType_MoreItem_MissRule()
        {
            //定义规则
            var rule = new Rule
            {
                Name  = "BaseComputeType_MoreItem_MissRule",
                Items = new List <RuleItem>
                {
                    new RuleItem
                    {
                        RuleItemType = "age",
                        ComputeType  = BaseComputeType.LessThan.ToString(),
                        Value        = "18",
                    },
                    new RuleItem
                    {
                        RuleItemType = "sex",
                        ComputeType  = BaseComputeType.EqualsTo.ToString(),
                        Value        = "man",
                    },
                    new RuleItem
                    {
                        RuleItemType = "weight",
                        ComputeType  = BaseComputeType.MoreThan.ToString(),
                        Value        = "60",
                    }
                },
            };
            //添加规则到引擎
            await RuleEngine.Clear();

            await RuleEngine.AddRule(rule);

            //定义事实
            var fact = new Fact {
                { "age", "14" }, { "sex", "man" }, { "weight", "50" }
            };
            //运算
            var res = await RuleEngine.Compute(fact);

            Assert.IsNotNull(res);
            Assert.IsNull(res.HitRule);
            Assert.IsFalse(res.Success);
            Assert.IsTrue(res.Infos.Any(x => x.MissRuleItemType == "weight"));
        }
Example #11
0
        public void TestMethod1()
        {
            var filename = "Rules.json";
            var car      = new SerializableCar();

            car.Classification = CarClassification.SportUtilityVehicle;
            car.WheelCount     = 2;

            var json = File.ReadAllText(filename);
            var deserializedObject = JsonConvert.DeserializeObject <SerializableCar>(json);
            var ruleEngine         = new RuleEngine <SerializableCar>();

            foreach (var deserializedRule in deserializedObject.Rules)
            {
                var rule = new Rule <SerializableCar>();

                foreach (var compositeCondition in deserializedRule.Conditions)
                {
                    foreach (var condition in compositeCondition.Conditions)
                    {
                        rule.AddCondition(condition.FieldName, condition.Operation, condition.Value, compositeCondition.LogicalOperation);
                    }
                }

                foreach (var action in deserializedRule.Actions)
                {
                    rule.AddAction(action.FieldName, action.Operation, action.Data);
                }

                ruleEngine.AddRule(rule);
            }

            ruleEngine.Evaluate(car);

            Assert.AreEqual(300, car.WheelCount);
        }