@@ -27,8 +27,7 @@ public WorkflowMiddlewareRunner(
2727 public async Task RunPreMiddleware ( WorkflowInstance workflow , WorkflowDefinition def )
2828 {
2929 var preMiddleware = _middleware
30- . Where ( m => m . Phase == WorkflowMiddlewarePhase . PreWorkflow )
31- . ToArray ( ) ;
30+ . Where ( m => m . Phase == WorkflowMiddlewarePhase . PreWorkflow ) ;
3231
3332 await RunWorkflowMiddleware ( workflow , preMiddleware ) ;
3433 }
@@ -37,47 +36,58 @@ public async Task RunPreMiddleware(WorkflowInstance workflow, WorkflowDefinition
3736 public async Task RunPostMiddleware ( WorkflowInstance workflow , WorkflowDefinition def )
3837 {
3938 var postMiddleware = _middleware
40- . Where ( m => m . Phase == WorkflowMiddlewarePhase . PostWorkflow )
41- . ToArray ( ) ;
42-
39+ . Where ( m => m . Phase == WorkflowMiddlewarePhase . PostWorkflow ) ;
4340 try
4441 {
4542 await RunWorkflowMiddleware ( workflow , postMiddleware ) ;
4643 }
4744 catch ( Exception exception )
4845 {
49- // On error, determine which error handler to run and then run it
46+ // TODO:
47+ // OnPostMiddlewareError should be IWorkflowMiddlewareErrorHandler
48+ // because we don't know to run other error handler type
5049 var errorHandlerType = def . OnPostMiddlewareError ?? typeof ( IWorkflowMiddlewareErrorHandler ) ;
51- using ( var scope = _serviceProvider . CreateScope ( ) )
52- {
53- var typeInstance = scope . ServiceProvider . GetService ( errorHandlerType ) ;
54- if ( typeInstance != null && typeInstance is IWorkflowMiddlewareErrorHandler handler )
55- {
56- await handler . HandleAsync ( exception ) ;
57- }
58- }
50+ await HandleWorkflowMiddlewareError ( exception ) ;
5951 }
6052 }
6153
6254 /// <inheritdoc cref="IWorkflowMiddlewareRunner.RunExecuteMiddleware"/>
63- public Task RunExecuteMiddleware ( WorkflowInstance workflow , WorkflowDefinition def )
55+ public async Task RunExecuteMiddleware ( WorkflowInstance workflow , WorkflowDefinition def )
56+ {
57+ var executeMiddleware = _middleware
58+ . Where ( m => m . Phase == WorkflowMiddlewarePhase . ExecuteWorkflow ) ;
59+
60+ try
61+ {
62+ await RunWorkflowMiddleware ( workflow , executeMiddleware ) ;
63+ }
64+ catch ( Exception exception )
65+ {
66+ await HandleWorkflowMiddlewareError ( exception ) ;
67+ }
68+ }
69+
70+ private async Task HandleWorkflowMiddlewareError ( Exception exception )
6471 {
65- throw new NotImplementedException ( ) ;
72+ using ( var scope = _serviceProvider . CreateScope ( ) )
73+ {
74+ var handler = scope . ServiceProvider . GetService < IWorkflowMiddlewareErrorHandler > ( ) ;
75+ if ( handler != null )
76+ {
77+ await handler . HandleAsync ( exception ) ;
78+ }
79+ }
6680 }
6781
68- private static async Task RunWorkflowMiddleware (
82+ private static Task RunWorkflowMiddleware (
6983 WorkflowInstance workflow ,
7084 IEnumerable < IWorkflowMiddleware > middlewareCollection )
7185 {
72- // Build the middleware chain
73- var middlewareChain = middlewareCollection
86+ return middlewareCollection
7487 . Reverse ( )
75- . Aggregate (
76- NoopWorkflowDelegate ,
77- ( previous , middleware ) => ( ) => middleware . HandleAsync ( workflow , previous )
78- ) ;
79-
80- await middlewareChain ( ) ;
88+ . Aggregate ( NoopWorkflowDelegate ,
89+ ( previous , middleware ) =>
90+ ( ) => middleware . HandleAsync ( workflow , previous ) ) ( ) ;
8191 }
8292 }
8393}
0 commit comments