Beispiel #1
0
        private void Execute(IList <IRule <T> > rules)
        {
            foreach (var rule in OrderByExecutionOrder(rules))
            {
                InvokeNestedRules(rule.Configuration.InvokeNestedRulesFirst, rule);

                if (rule.CanInvoke(_model, _ruleEngineConfiguration.IsRuleEngineTerminated()))
                {
                    InvokeProactiveRules(rule);

                    try
                    {
                        TraceMessage.Verbose(rule, TraceMessage.BeforeInvoke);
                        rule.BeforeInvoke();

                        TraceMessage.Verbose(rule, TraceMessage.Invoke);
                        var ruleResult = rule.Invoke();

                        TraceMessage.Verbose(rule, TraceMessage.AfterInvoke);
                        rule.AfterInvoke();

                        AddToRuleResults(ruleResult, rule.GetType().Name);
                    }

                    catch (Exception exception)
                    {
                        rule.UnhandledException = exception;
                        if (_rxRuleService.GetExceptionRules().ContainsKey(rule.GetType()))
                        {
                            InvokeExceptionRules(rule);
                        }
                        else
                        {
                            var globalExceptionHandler = _rules.GetGlobalExceptionHandler();

                            if (globalExceptionHandler is IRule <T> )
                            {
                                globalExceptionHandler.UnhandledException = exception;
                                Execute(new List <IRule <T> > {
                                    (IRule <T>)globalExceptionHandler
                                });
                            }

                            throw;
                        }
                    }

                    rule.UpdateRuleEngineConfiguration(_ruleEngineConfiguration);

                    InvokeReactiveRules(rule);
                }

                InvokeNestedRules(!rule.Configuration.InvokeNestedRulesFirst, rule);
            }
        }
Beispiel #2
0
        private async Task ExecuteRulesAsync(IList <IRuleAsync <T> > rules)
        {
            await ExecuteParallelRules(rules);

            foreach (var rule in OrderByExecutionOrder(rules))
            {
                await InvokeNestedRulesAsync(rule.Configuration.InvokeNestedRulesFirst, rule);

                if (rule.CanInvoke(_model, _ruleEngineConfiguration.IsRuleEngineTerminated()))
                {
                    try
                    {
                        await InvokeProactiveRulesAsync(rule);

                        AddToAsyncRuleResults(await ExecuteRuleAsync(rule));
                        rule.UpdateRuleEngineConfiguration(_ruleEngineConfiguration);

                        await InvokeReactiveRulesAsync(rule);
                    }
                    catch (Exception exception)
                    {
                        rule.UnhandledException = exception;

                        if (_rxRuleService.GetExceptionRules().ContainsKey(rule.GetType()))
                        {
                            await InvokeExceptionRulesAsync(rule);
                        }
                        else
                        {
                            var globalExceptionHandler = _rules.GetGlobalExceptionHandler();

                            if (globalExceptionHandler is IRuleAsync <T> )
                            {
                                globalExceptionHandler.UnhandledException = exception;
                                await ExecuteRulesAsync(new List <IRuleAsync <T> > {
                                    (IRuleAsync <T>)globalExceptionHandler
                                });
                            }

                            throw;
                        }
                    }
                }

                await InvokeNestedRulesAsync(!rule.Configuration.InvokeNestedRulesFirst, rule);
            }
        }