Add behavior that schedules child completion callbacks
This commit is contained in:
parent
604b5c3e82
commit
4ab6edb865
|
|
@ -11,15 +11,15 @@ public class BreakBehavior : IBehavior
|
|||
{
|
||||
public async ValueTask HandleSignalAsync(object signal, SignalContext context)
|
||||
{
|
||||
if (signal is not BreakSignal breakSignal)
|
||||
if (signal is not BreakSignal)
|
||||
return;
|
||||
|
||||
await OnBreakAsync(breakSignal, context);
|
||||
await OnBreakAsync(context);
|
||||
}
|
||||
|
||||
public ValueTask ExecuteAsync(ActivityExecutionContext context) => ValueTask.CompletedTask;
|
||||
|
||||
private async ValueTask OnBreakAsync(BreakSignal signal, SignalContext context)
|
||||
private async ValueTask OnBreakAsync(SignalContext context)
|
||||
{
|
||||
// Prevent bubbling.
|
||||
context.StopPropagation();
|
||||
|
|
|
|||
|
|
@ -0,0 +1,34 @@
|
|||
using Elsa.Contracts;
|
||||
using Elsa.Models;
|
||||
using Elsa.Signals;
|
||||
|
||||
namespace Elsa.Behaviors;
|
||||
|
||||
/// <summary>
|
||||
/// Implements a "break" behavior that handles the <see cref="BreakSignal"/> signal.
|
||||
/// </summary>
|
||||
public class ScheduledChildCallbackBehavior : IBehavior
|
||||
{
|
||||
public async ValueTask HandleSignalAsync(object signal, SignalContext context)
|
||||
{
|
||||
if (signal is not ActivityCompleted)
|
||||
return;
|
||||
|
||||
await OnChildActivityCompletedAsync(context);
|
||||
}
|
||||
|
||||
public ValueTask ExecuteAsync(ActivityExecutionContext context) => ValueTask.CompletedTask;
|
||||
|
||||
private async ValueTask OnChildActivityCompletedAsync(SignalContext context)
|
||||
{
|
||||
var activityExecutionContext = context.ActivityExecutionContext;
|
||||
var childActivityExecutionContext = context.SourceActivityExecutionContext;
|
||||
var childActivity = childActivityExecutionContext.Activity;
|
||||
var callbackEntry = activityExecutionContext.WorkflowExecutionContext.PopCompletionCallback(activityExecutionContext, childActivity);
|
||||
|
||||
if (callbackEntry == null)
|
||||
return;
|
||||
|
||||
await callbackEntry(activityExecutionContext, childActivityExecutionContext);
|
||||
}
|
||||
}
|
||||
|
|
@ -1,7 +1,7 @@
|
|||
using System.Linq.Expressions;
|
||||
using Elsa.Behaviors;
|
||||
using Elsa.Contracts;
|
||||
using Elsa.Helpers;
|
||||
using Elsa.Signals;
|
||||
|
||||
namespace Elsa.Models;
|
||||
|
||||
|
|
@ -12,7 +12,7 @@ public abstract class Activity : IActivity, ISignalHandler
|
|||
protected Activity()
|
||||
{
|
||||
TypeName = TypeNameHelper.GenerateTypeName(GetType());
|
||||
OnSignalReceived<ActivityCompleted>(OnChildActivityCompletedAsync);
|
||||
Behaviors.Add<ScheduledChildCallbackBehavior>();
|
||||
}
|
||||
|
||||
protected Activity(string activityType) : this()
|
||||
|
|
@ -76,19 +76,6 @@ public abstract class Activity : IActivity, ISignalHandler
|
|||
});
|
||||
}
|
||||
|
||||
protected virtual async ValueTask OnChildActivityCompletedAsync(ActivityCompleted signal, SignalContext context)
|
||||
{
|
||||
var activityExecutionContext = context.ActivityExecutionContext;
|
||||
var childActivityExecutionContext = context.SourceActivityExecutionContext;
|
||||
var childActivity = childActivityExecutionContext.Activity;
|
||||
var callbackEntry = activityExecutionContext.WorkflowExecutionContext.PopCompletionCallback(activityExecutionContext, childActivity);
|
||||
|
||||
if (callbackEntry == null)
|
||||
return;
|
||||
|
||||
await callbackEntry(activityExecutionContext, childActivityExecutionContext);
|
||||
}
|
||||
|
||||
async ValueTask IActivity.ExecuteAsync(ActivityExecutionContext context)
|
||||
{
|
||||
await ExecuteAsync(context);
|
||||
|
|
|
|||
Loading…
Reference in a new issue