private void CompileScript(ScriptEvaluator scriptEval) { if (scriptEval.Evaluators == null) { lock (scriptEval) { if (scriptEval.Evaluators == null) { ExpressionEvaluator[] evaluators = CreateExpressionEvaluators(scriptEval.Script); scriptEval.SetExpressionEvaluators(evaluators); } } } }
private object GetPreEvalDetails(object entity, ScriptEvaluator evaluator) { if (_logger.IsEnabled(LogLevel.Trace)) { return(new { PreEvalValues = entity, Script = evaluator.Script.Expressions .OrderBy(e => e.Sequence) .Select(e => new { e.AttributeName, e.Expression }) }); } return(new { }); }
private async Task ExecuteScript(object entity, ScriptEvaluator evaluator) { var preEvalDetails = GetPreEvalDetails(entity, evaluator); using (var durationLogger = _logger.LogTraceDuration(ScriptingLogEvents.ScriptExecution, "Script Evaluation")) { durationLogger.Log.LogTraceDetails(ScriptingLogEvents.ScriptPreEvaluation, "Pre-Evaluation Details", preEvalDetails); CompileScript(evaluator); SetDefaultAttributeValues(evaluator.Script, entity); await evaluator.ExecuteAsync(entity); durationLogger.Log.LogTraceDetails(ScriptingLogEvents.ScriptPostEvaluation, "Post-Evaluation Details", new { PostEvalValues = entity }); } }
public async Task ExecuteAsync(object entity, string scriptName = "default") { if (entity == null) { throw new ArgumentNullException(nameof(entity)); } if (scriptName == null) { throw new ArgumentNullException(nameof(scriptName)); } Type entityType = entity.GetType(); IEnumerable <ScriptEvaluator> scripts = _scriptEvaluators[entityType].ToArray(); if (!scripts.Any()) { return; } // Execute the default script if specified. var defaultEvalScript = scripts.FirstOrDefault(se => se.IsDefault); if (defaultEvalScript != null) { await ExecuteScript(entity, defaultEvalScript); } // Execute script with a specified name. if (scriptName != ScriptEvaluator.DefaultScriptName) { ScriptEvaluator namedEvalScript = scripts.FirstOrDefault(se => se.Script.Name == scriptName); if (namedEvalScript == null) { throw new InvalidOperationException( $"A script named: {scriptName} for the entity type of: {entityType} could not be found. " + "Note: Script names are case-sensitive."); } await ExecuteScript(entity, namedEvalScript); } }