8
8
9
9
namespace WorkflowCore . Services
10
10
{
11
- /// <inheritdoc />
11
+ /// <inheritdoc cref="IWorkflowMiddlewareRunner" />
12
12
public class WorkflowMiddlewareRunner : IWorkflowMiddlewareRunner
13
13
{
14
14
private static readonly WorkflowDelegate NoopWorkflowDelegate = ( ) => Task . CompletedTask ;
@@ -17,80 +17,74 @@ public class WorkflowMiddlewareRunner : IWorkflowMiddlewareRunner
17
17
18
18
public WorkflowMiddlewareRunner (
19
19
IEnumerable < IWorkflowMiddleware > middleware ,
20
- IServiceProvider serviceProvider
21
- )
20
+ IServiceProvider serviceProvider )
22
21
{
23
22
_middleware = middleware ;
24
23
_serviceProvider = serviceProvider ;
25
24
}
26
25
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"/>
37
27
public async Task RunPreMiddleware ( WorkflowInstance workflow , WorkflowDefinition def )
38
28
{
39
29
var preMiddleware = _middleware
40
- . Where ( m => m . Phase == WorkflowMiddlewarePhase . PreWorkflow )
41
- . ToArray ( ) ;
30
+ . Where ( m => m . Phase == WorkflowMiddlewarePhase . PreWorkflow ) ;
42
31
43
32
await RunWorkflowMiddleware ( workflow , preMiddleware ) ;
44
33
}
45
34
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>
55
- public async Task RunPostMiddleware ( WorkflowInstance workflow , WorkflowDefinition def )
35
+ /// <inheritdoc cref="IWorkflowMiddlewareRunner.RunPostMiddleware"/>
36
+ public Task RunPostMiddleware ( WorkflowInstance workflow , WorkflowDefinition def )
56
37
{
57
- var postMiddleware = _middleware
58
- . Where ( m => m . Phase == WorkflowMiddlewarePhase . PostWorkflow )
59
- . ToArray ( ) ;
38
+ return RunWorkflowMiddlewareWithErrorHandling (
39
+ workflow ,
40
+ WorkflowMiddlewarePhase . PostWorkflow ,
41
+ def . OnPostMiddlewareError ) ;
42
+ }
43
+
44
+ /// <inheritdoc cref="IWorkflowMiddlewareRunner.RunExecuteMiddleware"/>
45
+ public Task RunExecuteMiddleware ( WorkflowInstance workflow , WorkflowDefinition def )
46
+ {
47
+ return RunWorkflowMiddlewareWithErrorHandling (
48
+ workflow ,
49
+ WorkflowMiddlewarePhase . ExecuteWorkflow ,
50
+ def . OnExecuteMiddlewareError ) ;
51
+ }
52
+
53
+ public async Task RunWorkflowMiddlewareWithErrorHandling (
54
+ WorkflowInstance workflow ,
55
+ WorkflowMiddlewarePhase phase ,
56
+ Type middlewareErrorType )
57
+ {
58
+ var middleware = _middleware . Where ( m => m . Phase == phase ) ;
60
59
61
60
try
62
61
{
63
- await RunWorkflowMiddleware ( workflow , postMiddleware ) ;
62
+ await RunWorkflowMiddleware ( workflow , middleware ) ;
64
63
}
65
64
catch ( Exception exception )
66
65
{
67
- // On error, determine which error handler to run and then run it
68
- var errorHandlerType = def . OnPostMiddlewareError ?? typeof ( IWorkflowMiddlewareErrorHandler ) ;
66
+ var errorHandlerType = middlewareErrorType ?? typeof ( IWorkflowMiddlewareErrorHandler ) ;
67
+
69
68
using ( var scope = _serviceProvider . CreateScope ( ) )
70
69
{
71
70
var typeInstance = scope . ServiceProvider . GetService ( errorHandlerType ) ;
72
- if ( typeInstance != null && typeInstance is IWorkflowMiddlewareErrorHandler handler )
71
+ if ( typeInstance is IWorkflowMiddlewareErrorHandler handler )
73
72
{
74
73
await handler . HandleAsync ( exception ) ;
75
74
}
76
75
}
77
76
}
78
77
}
79
78
80
- private static async Task RunWorkflowMiddleware (
79
+ private static Task RunWorkflowMiddleware (
81
80
WorkflowInstance workflow ,
82
- IEnumerable < IWorkflowMiddleware > middlewareCollection
83
- )
81
+ IEnumerable < IWorkflowMiddleware > middlewareCollection )
84
82
{
85
- // Build the middleware chain
86
- var middlewareChain = middlewareCollection
83
+ return middlewareCollection
87
84
. Reverse ( )
88
85
. Aggregate (
89
86
NoopWorkflowDelegate ,
90
- ( previous , middleware ) => ( ) => middleware . HandleAsync ( workflow , previous )
91
- ) ;
92
-
93
- await middlewareChain ( ) ;
87
+ ( previous , middleware ) => ( ) => middleware . HandleAsync ( workflow , previous ) ) ( ) ;
94
88
}
95
89
}
96
90
}
0 commit comments