Small Workflow Context API improvements
This commit is contained in:
parent
3280570252
commit
bc496ddcc3
|
|
@ -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!);
|
||||
|
|
|
|||
|
|
@ -15,6 +15,5 @@ namespace Elsa.Services.Models
|
|||
public WorkflowInstance WorkflowInstance => WorkflowExecutionContext.WorkflowInstance;
|
||||
public Type ContextType => WorkflowBlueprint.ContextOptions!.ContextType;
|
||||
public string ContextId => WorkflowInstance.ContextId!;
|
||||
|
||||
}
|
||||
}
|
||||
|
|
@ -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;
|
||||
|
||||
}
|
||||
}
|
||||
|
|
@ -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))
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
Loading…
Reference in a new issue