Skip to content

Commit 98df2bb

Browse files
committed
Add new WorkflowMiddlewarePhase
1 parent e15b2a6 commit 98df2bb

File tree

4 files changed

+38
-29
lines changed

4 files changed

+38
-29
lines changed

src/WorkflowCore/Interface/IWorkflowMiddleware.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,12 @@ public enum WorkflowMiddlewarePhase
1616
/// <summary>
1717
/// The middleware should run after a workflow completes.
1818
/// </summary>
19-
PostWorkflow
19+
PostWorkflow,
20+
21+
/// <summary>
22+
/// The middleware should run after each workflow execution.
23+
/// </summary>
24+
ExecuteWorkflow
2025
}
2126

2227
/// <summary>

src/WorkflowCore/Interface/IWorkflowMiddlewareRunner.cs

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
namespace WorkflowCore.Interface
55
{
66
/// <summary>
7-
/// Runs workflow pre/post middleware.
7+
/// Runs workflow pre/post and execute middleware.
88
/// </summary>
99
public interface IWorkflowMiddlewareRunner
1010
{
@@ -29,5 +29,16 @@ public interface IWorkflowMiddlewareRunner
2929
/// <param name="def">The <see cref="WorkflowDefinition"/> definition.</param>
3030
/// <returns>A task that will complete when all middleware has run.</returns>
3131
Task RunPostMiddleware(WorkflowInstance workflow, WorkflowDefinition def);
32+
33+
/// <summary>
34+
/// Runs workflow-level middleware that is set to run at the
35+
/// <see cref="WorkflowMiddlewarePhase.ExecuteWorkflow"/> phase. Middleware will be run in the
36+
/// order in which they were registered with DI with middleware declared earlier starting earlier and
37+
/// completing later.
38+
/// </summary>
39+
/// <param name="workflow">The <see cref="WorkflowInstance"/> to run for.</param>
40+
/// <param name="def">The <see cref="WorkflowDefinition"/> definition.</param>
41+
/// <returns>A task that will complete when all middleware has run.</returns>
42+
Task RunExecuteMiddleware(WorkflowInstance workflow, WorkflowDefinition def);
3243
}
3344
}

src/WorkflowCore/Services/WorkflowExecutor.cs

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -96,12 +96,12 @@ public async Task<WorkflowExecutorResult> Execute(WorkflowInstance workflow, Can
9696
_cancellationProcessor.ProcessCancellations(workflow, def, wfResult);
9797
}
9898
ProcessAfterExecutionIteration(workflow, def, wfResult);
99-
DetermineNextExecutionTime(workflow, def);
99+
await DetermineNextExecutionTime(workflow, def);
100100

101101
using (var scope = _serviceProvider.CreateScope())
102102
{
103103
var middlewareRunner = scope.ServiceProvider.GetRequiredService<IWorkflowMiddlewareRunner>();
104-
await middlewareRunner.RunPostMiddleware(workflow, def);
104+
await middlewareRunner.RunExecuteMiddleware(workflow, def);
105105
}
106106

107107
return wfResult;
@@ -212,7 +212,7 @@ private void ProcessAfterExecutionIteration(WorkflowInstance workflow, WorkflowD
212212
}
213213
}
214214

215-
private void DetermineNextExecutionTime(WorkflowInstance workflow, WorkflowDefinition def)
215+
private async Task DetermineNextExecutionTime(WorkflowInstance workflow, WorkflowDefinition def)
216216
{
217217
//TODO: move to own class
218218
workflow.NextExecution = null;
@@ -257,6 +257,12 @@ private void DetermineNextExecutionTime(WorkflowInstance workflow, WorkflowDefin
257257
workflow.Status = WorkflowStatus.Complete;
258258
workflow.CompleteTime = _datetimeProvider.UtcNow;
259259

260+
using (var scope = _serviceProvider.CreateScope())
261+
{
262+
var middlewareRunner = scope.ServiceProvider.GetRequiredService<IWorkflowMiddlewareRunner>();
263+
await middlewareRunner.RunPostMiddleware(workflow, def);
264+
}
265+
260266
_publisher.PublishNotification(new WorkflowCompleted
261267
{
262268
EventTimeUtc = _datetimeProvider.UtcNow,

src/WorkflowCore/Services/WorkflowMiddlewareRunner.cs

Lines changed: 11 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

99
namespace WorkflowCore.Services
1010
{
11-
/// <inheritdoc />
11+
/// <inheritdoc cref="IWorkflowMiddlewareRunner" />
1212
public class WorkflowMiddlewareRunner : IWorkflowMiddlewareRunner
1313
{
1414
private static readonly WorkflowDelegate NoopWorkflowDelegate = () => Task.CompletedTask;
@@ -17,23 +17,13 @@ public class WorkflowMiddlewareRunner : IWorkflowMiddlewareRunner
1717

1818
public WorkflowMiddlewareRunner(
1919
IEnumerable<IWorkflowMiddleware> middleware,
20-
IServiceProvider serviceProvider
21-
)
20+
IServiceProvider serviceProvider)
2221
{
2322
_middleware = middleware;
2423
_serviceProvider = serviceProvider;
2524
}
2625

27-
28-
/// <summary>
29-
/// Runs workflow-level middleware that is set to run at the
30-
/// <see cref="WorkflowMiddlewarePhase.PreWorkflow"/> phase. Middleware will be run in the
31-
/// order in which they were registered with DI with middleware declared earlier starting earlier and
32-
/// completing later.
33-
/// </summary>
34-
/// <param name="workflow">The <see cref="WorkflowInstance"/> to run for.</param>
35-
/// <param name="def">The <see cref="WorkflowDefinition"/> definition.</param>
36-
/// <returns>A task that will complete when all middleware has run.</returns>
26+
/// <inheritdoc cref="IWorkflowMiddlewareRunner.RunPreMiddleware"/>
3727
public async Task RunPreMiddleware(WorkflowInstance workflow, WorkflowDefinition def)
3828
{
3929
var preMiddleware = _middleware
@@ -43,15 +33,7 @@ public async Task RunPreMiddleware(WorkflowInstance workflow, WorkflowDefinition
4333
await RunWorkflowMiddleware(workflow, preMiddleware);
4434
}
4535

46-
/// <summary>
47-
/// Runs workflow-level middleware that is set to run at the
48-
/// <see cref="WorkflowMiddlewarePhase.PostWorkflow"/> phase. Middleware will be run in the
49-
/// order in which they were registered with DI with middleware declared earlier starting earlier and
50-
/// completing later.
51-
/// </summary>
52-
/// <param name="workflow">The <see cref="WorkflowInstance"/> to run for.</param>
53-
/// <param name="def">The <see cref="WorkflowDefinition"/> definition.</param>
54-
/// <returns>A task that will complete when all middleware has run.</returns>
36+
/// <inheritdoc cref="IWorkflowMiddlewareRunner.RunPostMiddleware"/>
5537
public async Task RunPostMiddleware(WorkflowInstance workflow, WorkflowDefinition def)
5638
{
5739
var postMiddleware = _middleware
@@ -77,10 +59,15 @@ public async Task RunPostMiddleware(WorkflowInstance workflow, WorkflowDefinitio
7759
}
7860
}
7961

62+
/// <inheritdoc cref="IWorkflowMiddlewareRunner.RunExecuteMiddleware"/>
63+
public Task RunExecuteMiddleware(WorkflowInstance workflow, WorkflowDefinition def)
64+
{
65+
throw new NotImplementedException();
66+
}
67+
8068
private static async Task RunWorkflowMiddleware(
8169
WorkflowInstance workflow,
82-
IEnumerable<IWorkflowMiddleware> middlewareCollection
83-
)
70+
IEnumerable<IWorkflowMiddleware> middlewareCollection)
8471
{
8572
// Build the middleware chain
8673
var middlewareChain = middlewareCollection

0 commit comments

Comments
 (0)