Skip to content

Commit 3919df2

Browse files
Use static MessageConfiguration tied to ServiceCollection (#156)
1 parent 9fd7248 commit 3919df2

File tree

3 files changed

+56
-6
lines changed

3 files changed

+56
-6
lines changed
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
{
2+
"Projects": [
3+
{
4+
"Name": "AWS.Messaging",
5+
"Type": "Patch",
6+
"ChangelogMessages": [
7+
"Add support for AddAWSMessageBus being invoked multiple times against the same ServiceCollection. This allows different modules to register their own handlers rather than requiring a centralized registration."
8+
]
9+
}
10+
]
11+
}

src/AWS.Messaging/Configuration/MessageBusBuilder.cs

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ namespace AWS.Messaging.Configuration;
2525
/// </summary>
2626
public class MessageBusBuilder : IMessageBusBuilder
2727
{
28+
private static readonly Dictionary<IServiceCollection, MessageConfiguration> _messageConfigurations = new();
2829
private readonly MessageConfiguration _messageConfiguration;
2930
private readonly IList<ServiceDescriptor> _additionalServices = new List<ServiceDescriptor>();
3031
private readonly IServiceCollection _serviceCollection;
@@ -35,7 +36,15 @@ public class MessageBusBuilder : IMessageBusBuilder
3536
public MessageBusBuilder(IServiceCollection services)
3637
{
3738
_serviceCollection = services;
38-
_messageConfiguration = new MessageConfiguration();
39+
if (_messageConfigurations.TryGetValue(services, out var config))
40+
{
41+
_messageConfiguration = config;
42+
}
43+
else
44+
{
45+
_messageConfiguration = new MessageConfiguration();
46+
_messageConfigurations[services] = _messageConfiguration;
47+
}
3948
}
4049

4150
/// <inheritdoc/>
@@ -129,7 +138,6 @@ public IMessageBusBuilder AddSQSPoller(string queueUrl, Action<SQSMessagePollerO
129138
VisibilityTimeoutExtensionHeartbeatInterval = sqsMessagePollerOptions.VisibilityTimeoutExtensionHeartbeatInterval,
130139
WaitTimeSeconds = sqsMessagePollerOptions.WaitTimeSeconds,
131140
IsExceptionFatal = sqsMessagePollerOptions.IsExceptionFatal
132-
133141
};
134142

135143
_messageConfiguration.MessagePollerConfigurations.Add(sqsMessagePollerConfiguration);
@@ -308,7 +316,7 @@ internal void Build()
308316
_serviceCollection.TryAdd(ServiceDescriptor.Singleton<ILoggerFactory, NullLoggerFactory>());
309317
_serviceCollection.TryAdd(ServiceDescriptor.Singleton(typeof(ILogger<>), typeof(NullLogger<>)));
310318

311-
_serviceCollection.AddSingleton<IMessageConfiguration>(_messageConfiguration);
319+
_serviceCollection.TryAddSingleton<IMessageConfiguration>(_messageConfiguration);
312320
_serviceCollection.TryAddSingleton<IMessageSerializer, MessageSerializer>();
313321
_serviceCollection.TryAddSingleton<IEnvelopeSerializer, EnvelopeSerializer>();
314322
_serviceCollection.TryAddSingleton<IDateTimeHandler, DateTimeHandler>();
@@ -326,18 +334,20 @@ internal void Build()
326334

327335
if (_messageConfiguration.PublisherMappings.Any())
328336
{
329-
_serviceCollection.AddSingleton<IMessagePublisher, MessageRoutingPublisher>();
337+
_serviceCollection.TryAddSingleton<IMessagePublisher, MessageRoutingPublisher>();
330338

331339
if (_messageConfiguration.PublisherMappings.Any(x => x.PublishTargetType == PublisherTargetType.SQS_PUBLISHER))
332340
{
333341
_serviceCollection.TryAddAWSService<Amazon.SQS.IAmazonSQS>();
334342
_serviceCollection.TryAddSingleton<ISQSPublisher, SQSPublisher>();
335343
}
344+
336345
if (_messageConfiguration.PublisherMappings.Any(x => x.PublishTargetType == PublisherTargetType.SNS_PUBLISHER))
337346
{
338347
_serviceCollection.TryAddAWSService<Amazon.SimpleNotificationService.IAmazonSimpleNotificationService>();
339348
_serviceCollection.TryAddSingleton<ISNSPublisher, SNSPublisher>();
340349
}
350+
341351
if (_messageConfiguration.PublisherMappings.Any(x => x.PublishTargetType == PublisherTargetType.EVENTBRIDGE_PUBLISHER))
342352
{
343353
_serviceCollection.TryAddAWSService<Amazon.EventBridge.IAmazonEventBridge>();
@@ -351,7 +361,7 @@ internal void Build()
351361

352362
foreach (var subscriberMapping in _messageConfiguration.SubscriberMappings)
353363
{
354-
_serviceCollection.AddScoped(subscriberMapping.HandlerType);
364+
_serviceCollection.TryAddScoped(subscriberMapping.HandlerType);
355365
}
356366
}
357367

@@ -387,7 +397,7 @@ internal void Build()
387397

388398
foreach (var service in _additionalServices)
389399
{
390-
_serviceCollection.Add(service);
400+
_serviceCollection.TryAdd(service);
391401
}
392402
}
393403

test/AWS.Messaging.UnitTests/MessageBusBuilderTests.cs

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,35 @@ public void BuildMessageBus()
5757
CheckRequiredServices(serviceProvider);
5858
}
5959

60+
[Fact]
61+
public void BuildMessageBus_MultipleInvocations()
62+
{
63+
_serviceCollection.AddAWSMessageBus(builder =>
64+
{
65+
builder.AddSQSPublisher<OrderInfo>("sqsQueueUrl");
66+
builder.AddMessageHandler<AddressInfoHandler, AddressInfo>();
67+
});
68+
69+
_serviceCollection.AddAWSMessageBus(builder =>
70+
{
71+
builder.AddMessageHandler<ChatMessageHandler, ChatMessage>();
72+
});
73+
74+
var serviceProvider = _serviceCollection.BuildServiceProvider();
75+
76+
var messagePublisher = serviceProvider.GetService<IMessagePublisher>();
77+
Assert.NotNull(messagePublisher);
78+
79+
CheckRequiredServices(serviceProvider);
80+
81+
var mesageConfiguration = serviceProvider.GetRequiredService<IMessageConfiguration>();
82+
Assert.Equal(2, mesageConfiguration.SubscriberMappings.Count);
83+
Assert.Equal(typeof(AddressInfo), mesageConfiguration.SubscriberMappings[0].MessageType);
84+
Assert.Equal(typeof(AddressInfoHandler), mesageConfiguration.SubscriberMappings[0].HandlerType);
85+
Assert.Equal(typeof(ChatMessage), mesageConfiguration.SubscriberMappings[1].MessageType);
86+
Assert.Equal(typeof(ChatMessageHandler), mesageConfiguration.SubscriberMappings[1].HandlerType);
87+
}
88+
6089
[Fact]
6190
public void MessageBus_ConfigureBackoffPolicy_Default()
6291
{

0 commit comments

Comments
 (0)