@@ -10,18 +10,18 @@ internal class ProjectionProcessor<TProjection> : IProjectionProcessor<TProjecti
10
10
private readonly IReadOnlyCollection < ProjectionFilter > filters ;
11
11
private readonly IProjectionTelemetry telemetry ;
12
12
private readonly ProjectionMetadata < TProjection > projectionMetadata ;
13
- private readonly IServiceProvider serviceProvider ;
13
+ private readonly IServiceScopeFactory serviceScopeFactory ;
14
14
private readonly string projectionName ;
15
15
16
16
public ProjectionProcessor (
17
17
IProjectionOptionsFactory optionsFactory ,
18
18
IProjectionTelemetry telemetry ,
19
19
ProjectionMetadata < TProjection > projectionMetadata ,
20
- IServiceProvider serviceProvider )
20
+ IServiceScopeFactory serviceScopeFactory )
21
21
{
22
22
this . telemetry = telemetry ;
23
23
this . projectionMetadata = projectionMetadata ;
24
- this . serviceProvider = serviceProvider ;
24
+ this . serviceScopeFactory = serviceScopeFactory ;
25
25
filters = optionsFactory
26
26
. GetOptions < TProjection > ( )
27
27
. Filters ;
@@ -49,10 +49,6 @@ public async Task<ProjectionAction> ProcessBatchAsync(
49
49
50
50
foreach ( var events in groupedEvents )
51
51
{
52
- await using var scope = serviceProvider . CreateAsyncScope ( ) ;
53
-
54
- var projection = scope . ServiceProvider . GetRequiredService < TProjection > ( ) ;
55
-
56
52
using var operation = batchTelemetry . StartProjection ( events . Key ) ;
57
53
58
54
if ( ! projectionMetadata . CanConsumeOneOrMoreEvents ( events ) )
@@ -62,11 +58,16 @@ public async Task<ProjectionAction> ProcessBatchAsync(
62
58
continue ;
63
59
}
64
60
61
+ var eventStreamId = EventStreamId . FromStreamId ( events . Key ) ;
62
+ await using var scope = serviceScopeFactory . CreateAsyncScope ( ) ;
63
+ var projectionFactory = scope . ServiceProvider . GetRequiredService < IProjectionFactory > ( ) ;
64
+ var projection = await projectionFactory . CreateAsync < TProjection > ( eventStreamId , cancellationToken ) ;
65
+
65
66
try
66
67
{
67
68
await projection
68
69
. InitializeAsync (
69
- events . Key ,
70
+ eventStreamId ,
70
71
cancellationToken )
71
72
. ConfigureAwait ( false ) ;
72
73
0 commit comments