Skip to content

Commit 076d1b8

Browse files
committed
Add execute middleware implementation
1 parent e7d03aa commit 076d1b8

File tree

1 file changed

+35
-25
lines changed

1 file changed

+35
-25
lines changed

src/WorkflowCore/Services/WorkflowMiddlewareRunner.cs

Lines changed: 35 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)