public static BusinessRule <T, object> AddRuleWithParam <T>(this T item, string formula) where T : EntityBase <T> { var index = formula.IndexOf("="); var left = formula.Substring(0, index); var right = formula.Substring(index + 1); var compiler = new FormulaCompiler() .WithType <T>().WithType <User>(); var get = compiler.NewLambda() .WithThis <T>() .Returns <object>() .CompileToExpression(left); var func = compiler.NewLambda() .WithThis <T>() .WithParam <User>("User") .Returns <object>() .CompileToExpression(right); var f = func.Compile(); var r = new RuleFactory <T>(); var rule = r.CreateBusinessRule(e => f(e, User.Current), get) .WithModeAtStartup(BusinessRuleStartupMode.None) .AnalyzeDependencies(func); item.Extensions.Rules.Add(rule); return(rule); }
public void ValidateOnlyOnServerSide() { var f = new RuleFactory <Product>(); var rule = f.CreateBusinessRule(e => e.Quantity * e.NetPrice, e => e.GrossPrice) .ValidateOnlyOnServerSide().Start(); RuleContext.Strategy = () => RuleContextState.Client; var p = new Product { Quantity = 4, NetPrice = 5 }; p.Extensions.AddRuleFromPrototype(rule); p.Quantity = 5; p.GrossPrice.ShouldEqual(5 * 5); p.Extensions.BrokenRules.Count.ShouldEqual(0); RuleContext.Strategy = () => RuleContextState.Server; var p2 = new Product { Quantity = 4, NetPrice = 5 }; p2.Extensions.AddRuleFromPrototype(rule); p2.Quantity = 3; p2.GrossPrice.ShouldEqual(0); p2.Extensions.BrokenRules.Count.ShouldEqual(1); }
public void CreateRules() { var factory = new RuleFactory <Entity>(); factory.CreateActionRule(en => en.Name.ToString()); factory.CreateActionRuleWithoutDependency(en => en.Name.ToString()) .WithDependencies(en => en.Number); factory.CreateValidationRule(en => en.Number < 10); factory.CreateValidationRuleWithoutDependency(en => en.Number < 10) .WithDependencies(en => en.Number); factory.CreateBusinessRule(en => en.Number2 + en.Number3, en => en.Number); }
public void AddBusinessRuleFromPrototype() { var factory = new RuleFactory <Entity>(); var rule = factory.CreateBusinessRule(en => en.Number + en.Number2, en => en.Number3).Start(); var e = new Entity(); e.Extensions.AddRuleFromPrototype(rule); e.Number = 8; e.Number2 = 5; e.Number3.ShouldEqual(13); }