@@ -96,22 +96,18 @@ public void Build()
9696 s . ImplementationType == middlewareType )
9797 select middlewareType )
9898 {
99- _services . AddKeyedSingleton ( typeof ( IConsumerMiddleware ) , _consumerMiddlewareKey , middlewareType ) ;
99+ _services . AddKeyedScoped ( typeof ( IConsumerMiddleware ) , _consumerMiddlewareKey , middlewareType ) ;
100100 }
101101
102102 _services . AddSingleton < IHostedService > ( sp =>
103103 {
104104 var logger = sp . GetRequiredService < ILogger < ServiceBusConsumerHostedService > > ( ) ;
105- var localConsumerMiddlewares = sp . GetKeyedServices < IConsumerMiddleware > ( _consumerMiddlewareKey ) ?? [ ] ;
106- var globalConsumerMiddlewares = sp . GetServices < IConsumerMiddleware > ( ) ?? [ ] ;
107-
108- var consumerMiddlewares = globalConsumerMiddlewares . Union ( localConsumerMiddlewares ) ;
109105
110106 if ( ! string . IsNullOrWhiteSpace ( _queueName ) )
111107 {
112108 return new ServiceBusConsumerHostedService (
113109 ( rawMessage , rootProvider , cancellationToken ) =>
114- MessageConsumingHandler ( rawMessage , rootProvider , consumerMiddlewares , logger , cancellationToken ) ,
110+ MessageConsumingHandler ( rawMessage , rootProvider , _consumerMiddlewareKey , logger , cancellationToken ) ,
115111 sp ,
116112 logger ,
117113 _azureServiceBusConfiguration ,
@@ -120,7 +116,7 @@ public void Build()
120116
121117 return new ServiceBusConsumerHostedService (
122118 ( rawMessage , rootProvider , cancellationToken ) =>
123- MessageConsumingHandler ( rawMessage , rootProvider , consumerMiddlewares , logger , cancellationToken ) ,
119+ MessageConsumingHandler ( rawMessage , rootProvider , _consumerMiddlewareKey , logger , cancellationToken ) ,
124120 sp ,
125121 logger ,
126122 _azureServiceBusConfiguration ,
@@ -129,23 +125,38 @@ public void Build()
129125 } ) ;
130126 }
131127
132- private async Task MessageConsumingHandler ( ServiceBusReceivedMessage rawMessage , IServiceProvider rootProvider , IEnumerable < IConsumerMiddleware > middlewares , ILogger < ServiceBusConsumerHostedService > logger , CancellationToken cancellationToken )
128+ private async Task MessageConsumingHandler (
129+ ServiceBusReceivedMessage rawMessage ,
130+ IServiceProvider rootProvider ,
131+ object consumerMiddlewareKey ,
132+ ILogger < ServiceBusConsumerHostedService > logger ,
133+ CancellationToken cancellationToken )
133134 {
135+ using var scope = rootProvider . CreateScope ( ) ;
136+ var sp = scope . ServiceProvider ;
137+
138+ var global = sp . GetServices < IConsumerMiddleware > ( ) ?? [ ] ;
139+ var local = sp . GetKeyedServices < IConsumerMiddleware > ( consumerMiddlewareKey ) ?? [ ] ;
140+
141+ var middlewares = global
142+ . Concat ( local )
143+ . GroupBy ( m => m . GetType ( ) )
144+ . Select ( g => g . First ( ) )
145+ . ToList ( ) ;
146+
134147 Func < Task > finalStep = async ( ) =>
135148 {
136- await ProcessHandlersAsync ( rawMessage , rootProvider , logger , cancellationToken ) ;
149+ await ProcessHandlersAsync ( rawMessage , sp , logger , cancellationToken ) ;
137150 } ;
138151
139- if ( middlewares != null && middlewares . Any ( ) )
152+ if ( middlewares . Count > 0 )
140153 {
141154 Func < Task > next = finalStep ;
142155
143- foreach ( var middleware in middlewares . Reverse ( ) )
156+ foreach ( var middleware in middlewares . AsEnumerable ( ) . Reverse ( ) )
144157 {
145- var current = middleware ;
146158 var prevNext = next ;
147-
148- next = ( ) => current . InvokeAsync ( rawMessage , prevNext , cancellationToken ) ;
159+ next = ( ) => middleware . InvokeAsync ( rawMessage , prevNext , cancellationToken ) ;
149160 }
150161
151162 await next ( ) ;
0 commit comments