Skip to content

Commit 8c15c31

Browse files
author
Felipe Mattioli
committed
FEAT: Adding new configuration to use consumer middlewares follow scope DI
1 parent f26d1e9 commit 8c15c31

2 files changed

Lines changed: 26 additions & 15 deletions

File tree

src/AzureServiceBusFlow/Builders/ServiceBusConfigurationBuilder.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ public ServiceBusConfigurationBuilder UseGlobalConsumerMiddleware<TMiddleware>()
5151
s.ServiceType == typeof(IConsumerMiddleware) &&
5252
s.ImplementationType == typeof(TMiddleware)))
5353
{
54-
_services.AddSingleton<IConsumerMiddleware, TMiddleware>();
54+
_services.AddScoped<IConsumerMiddleware, TMiddleware>();
5555
}
5656

5757
return this;

src/AzureServiceBusFlow/Builders/ServiceBusConsumerConfigurationBuilder.cs

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

Comments
 (0)