88
99namespace WorkflowCore . Services
1010{
11- /// <inheritdoc />
11+ /// <inheritdoc cref="IWorkflowMiddlewareRunner" />
1212 public class WorkflowMiddlewareRunner : IWorkflowMiddlewareRunner
1313 {
1414 private static readonly WorkflowDelegate NoopWorkflowDelegate = ( ) => Task . CompletedTask ;
@@ -17,80 +17,74 @@ 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
40- . Where ( m => m . Phase == WorkflowMiddlewarePhase . PreWorkflow )
41- . ToArray ( ) ;
30+ . Where ( m => m . Phase == WorkflowMiddlewarePhase . PreWorkflow ) ;
4231
4332 await RunWorkflowMiddleware ( workflow , preMiddleware ) ;
4433 }
4534
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 )
5637 {
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 ) ;
6059
6160 try
6261 {
63- await RunWorkflowMiddleware ( workflow , postMiddleware ) ;
62+ await RunWorkflowMiddleware ( workflow , middleware ) ;
6463 }
6564 catch ( Exception exception )
6665 {
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+
6968 using ( var scope = _serviceProvider . CreateScope ( ) )
7069 {
7170 var typeInstance = scope . ServiceProvider . GetService ( errorHandlerType ) ;
72- if ( typeInstance != null && typeInstance is IWorkflowMiddlewareErrorHandler handler )
71+ if ( typeInstance is IWorkflowMiddlewareErrorHandler handler )
7372 {
7473 await handler . HandleAsync ( exception ) ;
7574 }
7675 }
7776 }
7877 }
7978
80- private static async Task RunWorkflowMiddleware (
79+ private static Task RunWorkflowMiddleware (
8180 WorkflowInstance workflow ,
82- IEnumerable < IWorkflowMiddleware > middlewareCollection
83- )
81+ IEnumerable < IWorkflowMiddleware > middlewareCollection )
8482 {
85- // Build the middleware chain
86- var middlewareChain = middlewareCollection
83+ return middlewareCollection
8784 . Reverse ( )
8885 . Aggregate (
8986 NoopWorkflowDelegate ,
90- ( previous , middleware ) => ( ) => middleware . HandleAsync ( workflow , previous )
91- ) ;
92-
93- await middlewareChain ( ) ;
87+ ( previous , middleware ) => ( ) => middleware . HandleAsync ( workflow , previous ) ) ( ) ;
9488 }
9589 }
9690}
0 commit comments