Improve expression evaluation (#133)
* Add test case for object-to-string target type * Add exception handling
This commit is contained in:
parent
dbb063eeb8
commit
f9af5e71d6
|
|
@ -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}";
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue