/// <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); }
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" }, } } }); }