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