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); } }
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); } }