Introduce NonPersistableAttribute to control what gets persisted in state

This commit is contained in:
Sipke Schoorstra 2021-05-31 19:50:42 +02:00
parent 3eaefab72f
commit 79131e2dde
4 changed files with 18 additions and 4 deletions

View file

@ -0,0 +1,9 @@
using System;
namespace Elsa.Attributes
{
[AttributeUsage(AttributeTargets.Property)]
public class NonPersistableAttribute : Attribute
{
}
}

View file

@ -71,6 +71,10 @@ namespace Elsa.Services
if (value != null)
{
property.SetValue(activity, value);
if (property.GetCustomAttribute<NonPersistableAttribute>() is not null)
return;
activityExecutionContext.SetState(property.Name, value);
}
}

View file

@ -15,7 +15,7 @@ namespace Elsa.Activities.Primitives
public class Inline : Activity
{
public Inline() => Function = context => new ValueTask<IActivityExecutionResult>(Done());
[ActivityInput] public Func<ActivityExecutionContext, ValueTask<IActivityExecutionResult>> Function { get; set; }
[ActivityInput, NonPersistable] public Func<ActivityExecutionContext, ValueTask<IActivityExecutionResult>> Function { get; set; }
protected override ValueTask<IActivityExecutionResult> OnExecuteAsync(ActivityExecutionContext context) => Function(context);
}
}

View file

@ -17,17 +17,18 @@ namespace Elsa.Handlers
{
var activity = notification.Activity;
var activityType = activity.GetType();
var properties = activityType.GetProperties().Where(x => x.GetCustomAttribute<ActivityInputAttribute>() != null || x.GetCustomAttribute<ActivityOutputAttribute>() != null);
var properties = activityType.GetProperties()
.Where(x => (x.GetCustomAttribute<ActivityInputAttribute>() != null || x.GetCustomAttribute<ActivityOutputAttribute>() != null) && x.GetCustomAttribute<NonPersistableAttribute>() == null);
var activityExecutionContext = notification.ActivityExecutionContext;
foreach (var property in properties)
{
var value = property.GetValue(activity);
// TODO: Implement #898 (activity persistence providers).
activityExecutionContext.SetState(property.Name, value);
}
return Task.CompletedTask;
}
}