Improve expression evaluation (#133)

* Add test case for object-to-string target type

* Add exception handling
This commit is contained in:
Sipke Schoorstra 2019-11-06 21:11:16 +01:00 committed by GitHub
parent dbb063eeb8
commit f9af5e71d6
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 18 additions and 2 deletions

View file

@ -5,16 +5,19 @@ using System.Threading;
using System.Threading.Tasks;
using Elsa.Services;
using Elsa.Services.Models;
using Microsoft.Extensions.Logging;
namespace Elsa.Expressions
{
public class WorkflowExpressionEvaluator : IWorkflowExpressionEvaluator
{
private readonly IDictionary<string, IExpressionEvaluator> evaluators;
private readonly ILogger logger;
public WorkflowExpressionEvaluator(IEnumerable<IExpressionEvaluator> evaluators)
public WorkflowExpressionEvaluator(IEnumerable<IExpressionEvaluator> evaluators, ILogger<WorkflowExpressionEvaluator> logger)
{
this.evaluators = evaluators.ToDictionary(x => x.Syntax);
this.logger = logger;
}
public async Task<object> EvaluateAsync(IWorkflowExpression expression, Type type, WorkflowExecutionContext workflowExecutionContext, CancellationToken cancellationToken)
@ -23,7 +26,16 @@ namespace Elsa.Expressions
return default;
var evaluator = evaluators[expression.Syntax];
return await evaluator.EvaluateAsync(expression.Expression, type, workflowExecutionContext, cancellationToken);
try
{
return await evaluator.EvaluateAsync(expression.Expression, type, workflowExecutionContext, cancellationToken);
}
catch (Exception e)
{
logger.LogError(e, "Error while evaluating {Expression}.", expression);
return $"Error while evaluating {expression.Syntax} expression \"{expression.Expression}\". Message: {e.Message}";
}
}
}
}

View file

@ -110,6 +110,10 @@ namespace Elsa.Scripting.JavaScript.Services
{
var obj = value.AsObject().ToObject();
var type = targetType ?? obj.GetType();
if (type == typeof(string))
return Convert.ToString(obj);
var json = JsonConvert.SerializeObject(obj, serializerSettings);
return JsonConvert.DeserializeObject(json, type, serializerSettings);
}