Small Workflow Context API improvements

This commit is contained in:
Sipke Schoorstra 2021-02-17 21:42:09 +01:00
parent 3280570252
commit bc496ddcc3
5 changed files with 61 additions and 6 deletions

View file

@ -35,13 +35,32 @@ namespace Elsa.Services.Models
public IActivityBlueprint ActivityBlueprint { get; }
public string ActivityId => ActivityBlueprint.Id;
public string? ContextId
{
get => WorkflowExecutionContext.ContextId;
set => WorkflowExecutionContext.ContextId = value;
}
public IReadOnlyCollection<string> Outcomes { get; set; }
public object? Input { get; }
public bool Resuming { get; }
public string? CorrelationId
{
get => WorkflowExecutionContext.CorrelationId;
set => WorkflowExecutionContext.CorrelationId = value;
}
public CancellationToken CancellationToken { get; }
public JObject GetData() => WorkflowInstance.ActivityData.GetItem(ActivityBlueprint.Id, () => new JObject());
public void SetState(string propertyName, object? value)
{
var data = GetData();
data.SetState(propertyName, value);
}
public T? GetState<T>(string propertyName)
{
var data = GetData();
@ -54,8 +73,10 @@ namespace Elsa.Services.Models
string propertyName = expression.Member.Name;
return GetState<T>(propertyName);
}
public T? GetContainerState<T>() => GetContainerState<T>(typeof(T).Name);
public T? GetParentState<T>(string key)
public T? GetContainerState<T>(string key)
{
var parentActivityId = ActivityBlueprint.Parent?.Id;
@ -66,6 +87,19 @@ namespace Elsa.Services.Models
return parentData.GetState<T>(key);
}
public void SetContainerState<T>(object? value) => SetContainerState(typeof(T).Name, value);
public void SetContainerState(string key, object? value)
{
var parentActivityId = ActivityBlueprint.Parent?.Id;
if (parentActivityId == null)
return;
var parentData = WorkflowExecutionContext.WorkflowInstance.ActivityData.GetItem(parentActivityId);
parentData?.SetState(key, value);
}
public object? Output
{
get => WorkflowExecutionContext.WorkflowInstance.ActivityOutput.GetItem(ActivityBlueprint.Id, () => null!);

View file

@ -15,6 +15,5 @@ namespace Elsa.Services.Models
public WorkflowInstance WorkflowInstance => WorkflowExecutionContext.WorkflowInstance;
public Type ContextType => WorkflowBlueprint.ContextOptions!.ContextType;
public string ContextId => WorkflowInstance.ContextId!;
}
}

View file

@ -14,4 +14,18 @@ namespace Elsa.Services.Models
public string ContextId => WorkflowExecutionContext.WorkflowInstance.ContextId!;
public object Context => WorkflowExecutionContext.WorkflowContext!;
}
public class SaveWorkflowContext<T> : SaveWorkflowContext
{
public SaveWorkflowContext(WorkflowExecutionContext workflowExecutionContext) : base(workflowExecutionContext)
{
}
public SaveWorkflowContext(SaveWorkflowContext context) : base(context.WorkflowExecutionContext)
{
}
public new T Context => (T)base.Context;
}
}

View file

@ -75,6 +75,12 @@ namespace Elsa.Services.Models
/// </summary>
public IDictionary<string, ICollection<Func<WorkflowExecutionContext, CancellationToken, ValueTask>>> Tasks { get; set; } = new Dictionary<string, ICollection<Func<WorkflowExecutionContext, CancellationToken, ValueTask>>>();
public string? ContextId
{
get => WorkflowInstance.ContextId;
set => WorkflowInstance.ContextId = value;
}
public void RegisterTask(string groupName, Func<WorkflowExecutionContext, CancellationToken, ValueTask> task)
{
if (!Tasks.ContainsKey(groupName))

View file

@ -9,14 +9,16 @@ namespace Elsa.Services
public abstract class WorkflowContextRefresher : ILoadWorkflowContext, ISaveWorkflowContext
{
public abstract IEnumerable<Type> SupportedTypes { get; }
public virtual ValueTask<string?> SaveAsync(SaveWorkflowContext context, CancellationToken cancellationToken = default) => new ValueTask<string?>();
public virtual ValueTask<object?> LoadAsync(LoadWorkflowContext context, CancellationToken cancellationToken = default) => new ValueTask<object?>();
public virtual ValueTask<string?> SaveAsync(SaveWorkflowContext context, CancellationToken cancellationToken = default) => new();
public virtual ValueTask<object?> LoadAsync(LoadWorkflowContext context, CancellationToken cancellationToken = default) => new();
}
public abstract class WorkflowContextRefresher<T> : ILoadWorkflowContext, ISaveWorkflowContext
{
public virtual IEnumerable<Type> SupportedTypes => new[] { typeof(T) };
public virtual ValueTask<string?> SaveAsync(SaveWorkflowContext context, CancellationToken cancellationToken = default) => new ValueTask<string?>();
public virtual ValueTask<object?> LoadAsync(LoadWorkflowContext context, CancellationToken cancellationToken = default) => new ValueTask<object?>();
ValueTask<string?> ISaveWorkflowContext.SaveAsync(SaveWorkflowContext context, CancellationToken cancellationToken) => SaveAsync(new SaveWorkflowContext<T>(context), cancellationToken);
async ValueTask<object?> ILoadWorkflowContext.LoadAsync(LoadWorkflowContext context, CancellationToken cancellationToken) => (T)await LoadAsync(context, cancellationToken);
public virtual ValueTask<string?> SaveAsync(SaveWorkflowContext<T> context, CancellationToken cancellationToken = default) => new();
public virtual ValueTask<T?> LoadAsync(LoadWorkflowContext context, CancellationToken cancellationToken) => new();
}
}