@@ -27,8 +27,7 @@ public WorkflowMiddlewareRunner(
27
27
public async Task RunPreMiddleware ( WorkflowInstance workflow , WorkflowDefinition def )
28
28
{
29
29
var preMiddleware = _middleware
30
- . Where ( m => m . Phase == WorkflowMiddlewarePhase . PreWorkflow )
31
- . ToArray ( ) ;
30
+ . Where ( m => m . Phase == WorkflowMiddlewarePhase . PreWorkflow ) ;
32
31
33
32
await RunWorkflowMiddleware ( workflow , preMiddleware ) ;
34
33
}
@@ -37,47 +36,58 @@ public async Task RunPreMiddleware(WorkflowInstance workflow, WorkflowDefinition
37
36
public async Task RunPostMiddleware ( WorkflowInstance workflow , WorkflowDefinition def )
38
37
{
39
38
var postMiddleware = _middleware
40
- . Where ( m => m . Phase == WorkflowMiddlewarePhase . PostWorkflow )
41
- . ToArray ( ) ;
42
-
39
+ . Where ( m => m . Phase == WorkflowMiddlewarePhase . PostWorkflow ) ;
43
40
try
44
41
{
45
42
await RunWorkflowMiddleware ( workflow , postMiddleware ) ;
46
43
}
47
44
catch ( Exception exception )
48
45
{
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
50
49
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 ) ;
59
51
}
60
52
}
61
53
62
54
/// <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 )
64
71
{
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
+ }
66
80
}
67
81
68
- private static async Task RunWorkflowMiddleware (
82
+ private static Task RunWorkflowMiddleware (
69
83
WorkflowInstance workflow ,
70
84
IEnumerable < IWorkflowMiddleware > middlewareCollection )
71
85
{
72
- // Build the middleware chain
73
- var middlewareChain = middlewareCollection
86
+ return middlewareCollection
74
87
. 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 ) ) ( ) ;
81
91
}
82
92
}
83
93
}
0 commit comments