diff --git a/src/core/Elsa.Abstractions/Services/Models/ActivityExecutionContext.cs b/src/core/Elsa.Abstractions/Services/Models/ActivityExecutionContext.cs index b60a0e78e..de3e40ba4 100644 --- a/src/core/Elsa.Abstractions/Services/Models/ActivityExecutionContext.cs +++ b/src/core/Elsa.Abstractions/Services/Models/ActivityExecutionContext.cs @@ -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 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(string propertyName) { var data = GetData(); @@ -54,8 +73,10 @@ namespace Elsa.Services.Models string propertyName = expression.Member.Name; return GetState(propertyName); } + + public T? GetContainerState() => GetContainerState(typeof(T).Name); - public T? GetParentState(string key) + public T? GetContainerState(string key) { var parentActivityId = ActivityBlueprint.Parent?.Id; @@ -66,6 +87,19 @@ namespace Elsa.Services.Models return parentData.GetState(key); } + public void SetContainerState(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!); diff --git a/src/core/Elsa.Abstractions/Services/Models/LoadWorkflowContext.cs b/src/core/Elsa.Abstractions/Services/Models/LoadWorkflowContext.cs index a22cd8f00..441be9b9b 100644 --- a/src/core/Elsa.Abstractions/Services/Models/LoadWorkflowContext.cs +++ b/src/core/Elsa.Abstractions/Services/Models/LoadWorkflowContext.cs @@ -15,6 +15,5 @@ namespace Elsa.Services.Models public WorkflowInstance WorkflowInstance => WorkflowExecutionContext.WorkflowInstance; public Type ContextType => WorkflowBlueprint.ContextOptions!.ContextType; public string ContextId => WorkflowInstance.ContextId!; - } } \ No newline at end of file diff --git a/src/core/Elsa.Abstractions/Services/Models/SaveWorkflowContext.cs b/src/core/Elsa.Abstractions/Services/Models/SaveWorkflowContext.cs index 7409f2f76..2c6d148fe 100644 --- a/src/core/Elsa.Abstractions/Services/Models/SaveWorkflowContext.cs +++ b/src/core/Elsa.Abstractions/Services/Models/SaveWorkflowContext.cs @@ -14,4 +14,18 @@ namespace Elsa.Services.Models public string ContextId => WorkflowExecutionContext.WorkflowInstance.ContextId!; public object Context => WorkflowExecutionContext.WorkflowContext!; } + + public class SaveWorkflowContext : SaveWorkflowContext + { + public SaveWorkflowContext(WorkflowExecutionContext workflowExecutionContext) : base(workflowExecutionContext) + { + } + + public SaveWorkflowContext(SaveWorkflowContext context) : base(context.WorkflowExecutionContext) + { + } + + public new T Context => (T)base.Context; + + } } \ No newline at end of file diff --git a/src/core/Elsa.Abstractions/Services/Models/WorkflowExecutionContext.cs b/src/core/Elsa.Abstractions/Services/Models/WorkflowExecutionContext.cs index 8e12a6e3c..2f643b90a 100644 --- a/src/core/Elsa.Abstractions/Services/Models/WorkflowExecutionContext.cs +++ b/src/core/Elsa.Abstractions/Services/Models/WorkflowExecutionContext.cs @@ -75,6 +75,12 @@ namespace Elsa.Services.Models /// public IDictionary>> Tasks { get; set; } = new Dictionary>>(); + public string? ContextId + { + get => WorkflowInstance.ContextId; + set => WorkflowInstance.ContextId = value; + } + public void RegisterTask(string groupName, Func task) { if (!Tasks.ContainsKey(groupName)) diff --git a/src/core/Elsa.Abstractions/Services/WorkflowContextRefresher.cs b/src/core/Elsa.Abstractions/Services/WorkflowContextRefresher.cs index 08334412c..c7643d0d1 100644 --- a/src/core/Elsa.Abstractions/Services/WorkflowContextRefresher.cs +++ b/src/core/Elsa.Abstractions/Services/WorkflowContextRefresher.cs @@ -9,14 +9,16 @@ namespace Elsa.Services public abstract class WorkflowContextRefresher : ILoadWorkflowContext, ISaveWorkflowContext { public abstract IEnumerable SupportedTypes { get; } - public virtual ValueTask SaveAsync(SaveWorkflowContext context, CancellationToken cancellationToken = default) => new ValueTask(); - public virtual ValueTask LoadAsync(LoadWorkflowContext context, CancellationToken cancellationToken = default) => new ValueTask(); + public virtual ValueTask SaveAsync(SaveWorkflowContext context, CancellationToken cancellationToken = default) => new(); + public virtual ValueTask LoadAsync(LoadWorkflowContext context, CancellationToken cancellationToken = default) => new(); } public abstract class WorkflowContextRefresher : ILoadWorkflowContext, ISaveWorkflowContext { public virtual IEnumerable SupportedTypes => new[] { typeof(T) }; - public virtual ValueTask SaveAsync(SaveWorkflowContext context, CancellationToken cancellationToken = default) => new ValueTask(); - public virtual ValueTask LoadAsync(LoadWorkflowContext context, CancellationToken cancellationToken = default) => new ValueTask(); + ValueTask ISaveWorkflowContext.SaveAsync(SaveWorkflowContext context, CancellationToken cancellationToken) => SaveAsync(new SaveWorkflowContext(context), cancellationToken); + async ValueTask ILoadWorkflowContext.LoadAsync(LoadWorkflowContext context, CancellationToken cancellationToken) => (T)await LoadAsync(context, cancellationToken); + public virtual ValueTask SaveAsync(SaveWorkflowContext context, CancellationToken cancellationToken = default) => new(); + public virtual ValueTask LoadAsync(LoadWorkflowContext context, CancellationToken cancellationToken) => new(); } } \ No newline at end of file