/// <summary>
        /// This is entry point of rule engine.This class dynamically invokes method based on selected rules
        /// </summary>
        /// <param name="paymentInfo"></param>
        public List <string> ProcessPayment(PaymentInfo paymentInfo)
        {
            List <string> methodList     = new List <string>();
            var           qualifiedRules = new RuleEvaluator().EvaluateQualifyingRules(paymentInfo);
            StringBuilder sb             = new StringBuilder();

            foreach (Rule rule in qualifiedRules)
            {
                sb.Append(rule.MethodName);
            }

            methodList = sb.ToString().Split(';').ToList();
            var methodCount = methodList.Count;

            methodList.RemoveAt(--methodCount);
            List <string> finalResult = new List <string>();

            //Dynamically invoking methods
            foreach (string methodName in methodList)
            {
                MethodExecutor me         = new MethodExecutor();
                Type           methodType = me.GetType();
                MethodInfo     method     = methodType.GetMethod(methodName);
                object         result     = method.Invoke(me, new object[] { paymentInfo.PaymentId });
                finalResult.Add(result.ToString());
            }

            return(finalResult);
        }
Esempio n. 2
0
        static void Main(string[] args)
        {
            //setup our DI
            //var serviceProvider = new ServiceCollection()
            //
            //    .AddTransient<IRule, ActivateMembershipRule>()
            //    .AddTransient<IRule, FreeFirstAidVideoRule>()
            //    .AddTransient<IRule, GenerateCommisionPaymentRule>()
            //    .AddTransient<IRule, GenerateDuplicatePackingSlipRule>()
            //    .AddTransient<IRule, GeneratePackingSlipRule>()
            //    .AddTransient<IRule, UpgradeMembershipRule>()
            //    .BuildServiceProvider();



            var ruleEvaluator = new RuleEvaluator(new List <IRule>
            {
                new ActivateMembershipRule(),
                new UpgradeMembershipRule(),
                new FreeFirstAidVideoRule(),
                new GenerateCommisionPaymentRule(),
                new GeneratePackingSlipRule(),
                new GenerateDuplicatePackingSlipRule()
            });

            ruleEvaluator.Evaluate(new Payment
            {
                Products = new List <Product>
                {
                    new Product {
                        Name     = "A physical product",
                        Category = new ProductCategory
                        {
                            Type = ProductType.Physical,
                            Name = Guid.NewGuid().ToString()
                        },
                    },
                    new Product {
                        Name     = "Learning to Ski",
                        Category = new ProductCategory
                        {
                            Type = ProductType.Abstract,
                            Name = "Video"
                        }
                    },

                    new Product {
                        Name     = "A Book",
                        Category = new ProductCategory
                        {
                            Type = ProductType.Abstract,
                            Name = "Book"
                        },
                    }
                }
            });
        }