コード例 #1
0
 private async Task InvokeNestedRulesAsync(bool invokeNestedRules, IGeneralRule <T> rule)
 {
     if (invokeNestedRules && rule.IsNested)
     {
         await ExecuteAsyncRules(_activeRuleService.FilterActivatingRules(rule.GetRules()));
     }
 }
コード例 #2
0
 private void InvokeNestedRules(bool invokeNestedRules, IGeneralRule <T> rule)
 {
     if (invokeNestedRules && rule.IsNested)
     {
         Execute(_activeRuleService.FilterActivatingRules(OrderByExecutionOrder(rule.GetRules())));
     }
 }
コード例 #3
0
 private void InvokeReactiveRules(IGeneralRule<T> rule)
 {
     if (_rxRuleService.GetReactiveRules().ContainsKey(rule.GetType()))
     {
         Execute(_rxRuleService.GetReactiveRules()[rule.GetType()].ToList());
     }
 }
コード例 #4
0
        private void InitializeRule(IGeneralRule <T> rule, IGeneralRule <T> nestingRule = null)
        {
            rule.Model         = _model;
            rule.Configuration = new RuleEngineConfiguration <T>(rule.Configuration)
            {
                RuleEngineId = _ruleEngineId
            };

            if (nestingRule != null && nestingRule.Configuration.NestedRulesInheritConstraint)
            {
                rule.Configuration.Constraint = nestingRule.Configuration.Constraint;
                rule.Configuration.NestedRulesInheritConstraint = true;
            }

            if (rule is RuleAsync <T> parallelRule && parallelRule.IsParallel &&
                nestingRule is RuleAsync <T> nestingParallelRule)
            {
                if (nestingParallelRule.ParallelConfiguration != null &&
                    nestingParallelRule.ParallelConfiguration.NestedParallelRulesInherit)
                {
                    var cancellationTokenSource = parallelRule.ParallelConfiguration.CancellationTokenSource;
                    parallelRule.ParallelConfiguration = new ParallelConfiguration <T>
                    {
                        NestedParallelRulesInherit = true,
                        CancellationTokenSource    = cancellationTokenSource,
                        TaskCreationOptions        = nestingParallelRule.ParallelConfiguration.TaskCreationOptions,
                        TaskScheduler = nestingParallelRule.ParallelConfiguration.TaskScheduler
                    };
                }
            }

            rule.Resolve = _dependencyResolver;
        }
コード例 #5
0
 public static void UpdateRuleEngineConfiguration <T>(this IGeneralRule <T> rule,
                                                      IConfiguration <T> ruleEngineConfiguration) where T : class, new()
 {
     if (ruleEngineConfiguration.Terminate == null && rule.Configuration.Terminate == true)
     {
         ruleEngineConfiguration.Terminate = true;
     }
 }
コード例 #6
0
        public void Initialize(IEnumerable <IGeneralRule <T> > rules, IGeneralRule <T> nestingRule = null)
        {
            foreach (var rule in rules.OfType <IRule <T> >())
            {
                RuleInitializer(rule, nestingRule);

                rule.Initialize();

                if (rule.IsNested)
                {
                    Initialize(rule.GetRules(), rule);
                }
            }
        }
コード例 #7
0
        public void RuleInitializer(IGeneralRule <T> rule, IGeneralRule <T> nestingRule = null)
        {
            rule.Model         = _model;
            rule.Configuration = new RuleEngineConfiguration <T>(rule.Configuration)
            {
                RuleEngineId = _ruleEngineId
            };

            if (nestingRule != null && nestingRule.Configuration.NestedRulesInheritConstraint)
            {
                rule.Configuration.Constraint = nestingRule.Configuration.Constraint;
                rule.Configuration.NestedRulesInheritConstraint = true;
            }

            rule.Resolve = _dependencyResolver;
        }
コード例 #8
0
        public Task InitializeAsync(IEnumerable <IGeneralRule <T> > rules, IGeneralRule <T> nestingRule = null)
        {
            var initBag = new ConcurrentBag <Task>();

            Parallel.ForEach(rules.OfType <IRuleAsync <T> >(), rule =>
            {
                RuleInitializer(rule, nestingRule);

                initBag.Add(rule.InitializeAsync());

                if (rule.IsNested)
                {
                    InitializeAsync(rule.GetRules(), rule);
                }
            });
            return(Task.WhenAll(initBag));
        }
コード例 #9
0
        public static RuleType GetRuleType <T>(this IGeneralRule <T> rule) where T : class, new()
        {
            if (rule.IsProactive)
            {
                return(RuleType.ProActiveRule);
            }
            if (rule.IsReactive)
            {
                return(RuleType.ReActiveRule);
            }
            if (rule.IsExceptionHandler)
            {
                return(RuleType.ExceptionHandlerRule);
            }

            return(RuleType.None);
        }
コード例 #10
0
 public static string GetRuleName <T>(this IGeneralRule <T> rule) where T : class, new() =>
 rule.GetType().Name;
コード例 #11
0
 public static Guid GetRuleEngineId <T>(this IGeneralRule <T> rule) where T : class, new() =>
 rule.Configuration.To <RuleEngineConfiguration <T> >().RuleEngineId;
コード例 #12
0
 public void AddRule(IGeneralRule <T> rule) => Rules.Add(rule);
コード例 #13
0
 public static bool CanInvoke <T>(this IGeneralRule <T> rule) where T : class, new() =>
 !rule.Configuration.Skip && rule.Configuration.Constraint.Invoke2(rule.Model);
コード例 #14
0
 public static void Verbose <T>(IGeneralRule <T> rule, string message) where T : class, new()
 {
     Trace.WriteLineIf(TraceSwitch.TraceVerbose, $"Executing {rule.GetType().Name} - {message}", "Information");
 }
コード例 #15
0
 public static bool CanInvoke <T>(this IGeneralRule <T> rule, T model, bool terminated) where T : class, new() =>
 !rule.Configuration.Skip && rule.Configuration.Constraint.Invoke2(model) && !terminated;