From 2c223e39c8eb7025a8e6d599cc4fa96c16022f27 Mon Sep 17 00:00:00 2001 From: Rafael Lillo <7280959+lillo42@users.noreply.github.com> Date: Fri, 8 May 2026 21:36:22 +0100 Subject: [PATCH] normalize --- .gitattributes | 9 +++ samples/AwsTaskQueue/Program.cs | 6 +- samples/GcpSample/Program.cs | 4 +- samples/MongoDbSample/Program.cs | 6 +- samples/RedisSample/Program.cs | 4 +- .../Mappers/FarewellEventMessageMapper.cs | 4 +- .../Mappers/GreetingEventMessageMapper.cs | 2 +- samples/RmqTaskQueue/Program.cs | 4 +- samples/RocketMqSample/Program.cs | 2 +- samples/SqlServerSample/Program.cs | 8 +-- .../SchedulerFactoryBuilderExtensions.cs | 8 +-- .../SchedulerFactoryBuilder.cs | 18 ++--- .../SchedulerGroupBuilder.cs | 6 +- .../SchedulerFactoryBuilderExtensions.cs | 8 +-- .../SchedulerFactoryBuilder.cs | 18 ++--- .../SchedulerGroupBuilder.cs | 6 +- .../Extensions/ConsumerBuilderExtensions.cs | 5 +- ...FirestoreConfigurationBuilderExtensions.cs | 22 +++--- .../GcpPubSubSubscriptionBuilderExtensions.cs | 10 +-- .../GcpPublicationBuilderExtensions.cs | 2 +- .../GcpPublicationFactoryBuilderExtensions.cs | 4 +- .../LuggageStoreBuilderExtensions.cs | 2 +- .../Extensions/ProducerExtensions.cs | 2 +- .../SpannerOutboxBuilderExtensions.cs | 2 +- .../FirestoreCollectionBuilder.cs | 3 +- .../FirestoreConfigurationBuilder.cs | 3 +- .../FirestoreLockingBuilder.cs | 6 +- .../FirestoreOutboxBuilder.cs | 4 +- .../GcpConfigurator.cs | 20 +++--- .../GcpMessagingGatewayConnectionBuilder.cs | 31 ++++---- .../GcpPubSubSubscriptionBuilder.cs | 5 +- .../GcpPublicationBuilder.cs | 1 + .../GcpPublicationFactoryBuilder.cs | 8 +-- .../GcsLuggageStoreBuilder.cs | 4 +- .../PubSubSubscriptionConfigurator.cs | 2 +- .../SpannerOutboxBuilder.cs | 6 +- .../Extensions/ConsumerBuilderExtensions.cs | 12 ++-- ...MessageProducerFactoryBuilderExtensions.cs | 4 +- ...ngGatewayConfigurationBuilderExtensions.cs | 2 +- .../KafkaSubscriptionBuilderExtensions.cs | 2 +- .../KafkaConfigurator.cs | 10 +-- .../KafkaMessageProducerFactoryBuilder.cs | 4 +- ...fkaMessagingGatewayConfigurationBuilder.cs | 10 +-- .../KafkaPublicationBuilder.cs | 4 +- .../KafkaSubscriptionBuilder.cs | 50 ++++++------- .../KafkaSubscriptionConfigurator.cs | 2 +- .../Extensions/ConsumerBuilderExtensions.cs | 6 +- .../Extensions/FluentBrighterExtensions.cs | 2 +- .../LuggageStoreBuilderExtensions.cs | 4 +- .../MongoDbConfigurationBuilderExtensions.cs | 12 ++-- .../MongoDbInboxBuilderExtensions.cs | 4 +- .../MongoDbLockingBuilderExtensions.cs | 4 +- .../MongoDbOutboxBuilderExtensions.cs | 6 +- .../Extensions/ProducersExtensions.cs | 8 +-- .../MongoDbConfigurationBuilder.cs | 6 +- .../MongoDbConfigurator.cs | 10 +-- .../MongoDbInboxBuilder.cs | 4 +- .../MongoDbLuggageStoreBuilder.cs | 14 ++-- .../Extensions/MySqlInboxBuilderExtensions.cs | 2 +- .../Extensions/ProducersExtensions.cs | 8 +-- .../MySqlConfigurator.cs | 8 +-- .../MySqlInboxBuilder.cs | 4 +- .../MySqlOutboxBuilder.cs | 4 +- .../Extensions/ConsumerBuilderExtensions.cs | 12 ++-- ...MessageProducerFactoryBuilderExtensions.cs | 10 +-- .../PostgresSubscriptionBuilderExtensions.cs | 6 +- .../Extensions/ProducersExtensions.cs | 2 +- .../PostgresConfigurator.cs | 8 +-- .../PostgresInboxBuilder.cs | 4 +- .../PostgresMessageProducerFactoryBuilder.cs | 6 +- .../PostgresOutboxBuilder.cs | 6 +- .../PostgresPublicationBuilder.cs | 2 +- .../PostgresSubscriptionBuilder.cs | 48 ++++++------- .../PostgresSubscriptionConfigurator.cs | 2 +- .../AmqpUriSpecificationBuilder.cs | 14 ++-- .../ExchangeBuilder.cs | 8 +-- .../AmqpUriSpecificationBuilderExtensions.cs | 2 +- .../Extensions/ConsumerBuilderExtensions.cs | 14 ++-- .../Extensions/ExchangeBuilderExtensions.cs | 16 ++--- ...agingGatewayConnectionBuilderExtensions.cs | 12 ++-- .../RmqPublicationBuilderExtensions.cs | 4 +- .../RmqSubscriptionBuilderExtensions.cs | 18 ++--- .../RmqSubscriptionConfigurationExtensions.cs | 6 +- .../RabbitMqConfigurator.cs | 10 +-- .../RabbitMqSubscriptionConfigurator.cs | 2 +- .../RmqMessageProducerFactoryBuilder.cs | 4 +- .../RmqMessagingGatewayConnectionBuilder.cs | 8 +-- .../RmqPublicationBuilder.cs | 4 +- .../RmqSubscriptionBuilder.cs | 72 +++++++++---------- .../AmqpUriSpecificationBuilder.cs | 14 ++-- .../ExchangeBuilder.cs | 8 +-- .../AmqpUriSpecificationBuilderExtensions.cs | 2 +- .../Extensions/ConsumerBuilderExtensions.cs | 14 ++-- .../Extensions/ExchangeBuilderExtensions.cs | 16 ++--- ...agingGatewayConnectionBuilderExtensions.cs | 12 ++-- .../RmqPublicationBuilderExtensions.cs | 4 +- .../RmqSubscriptionBuilderExtensions.cs | 16 ++--- .../RmqSubscriptionConfigurationExtensions.cs | 2 +- .../RabbitMqConfigurator.cs | 10 +-- .../RabbitMqSubscriptionConfigurator.cs | 2 +- .../RmqMessageProducerFactoryBuilder.cs | 4 +- .../RmqMessagingGatewayConnectionBuilder.cs | 8 +-- .../RmqPublicationBuilder.cs | 4 +- .../RmqSubscriptionBuilder.cs | 72 +++++++++---------- .../Extensions/ConsumerBuilderExtensions.cs | 6 +- ...MessageProducerFactoryBuilderExtensions.cs | 4 +- .../RedisSubscriptionBuilderExtensions.cs | 2 +- .../RedisConfigurator.cs | 10 +-- .../RedisMessageProducerFactoryBuilder.cs | 10 +-- ...disMessagingGatewayConfigurationBuilder.cs | 60 ++++++++-------- .../RedisPublicationBuilder.cs | 40 +++++------ .../RedisSubscriptionBuilder.cs | 3 +- .../RedisSubscriptionConfigurator.cs | 6 +- .../Extensions/ConsumerBuilderExtensions.cs | 14 ++-- ...agingGatewayConnectionBuilderExtensions.cs | 2 +- .../RocketMqPublicationBuilderExtensions.cs | 2 +- .../RocketSubscriptionBuilderExtensions.cs | 8 +-- ...cketSubscriptionConfigurationExtensions.cs | 4 +- .../RocketMessageProducerFactoryBuilder.cs | 4 +- ...RocketMessagingGatewayConnectionBuilder.cs | 16 ++--- .../RocketMqConfigurator.cs | 10 +-- .../RocketMqPublicationBuilder.cs | 6 +- .../RocketMqSubscriptionBuilder.cs | 58 +++++++-------- .../RocketMqSubscriptionConfigurator.cs | 2 +- .../Extensions/ConsumerBuilderExtensions.cs | 20 +++--- .../Extensions/FluentBrighterExtensions.cs | 2 +- .../Extensions/ProducersExtensions.cs | 6 +- ...MessageProducerFactoryBuilderExtensions.cs | 6 +- .../SqlServerOutboxBuilderExtensions.cs | 2 +- .../SqlServerConfigurator.cs | 10 +-- .../SqlServerInboxBuilder.cs | 2 +- .../SqlServerMessageProducerFactoryBuilder.cs | 4 +- .../SqlServerOutboxBuilder.cs | 4 +- .../SqlServerSubscriptionBuilder.cs | 32 ++++----- .../Extensions/ProducersExtensions.cs | 2 +- .../SqliteConfigurator.cs | 6 +- .../SqliteInboxBuilder.cs | 8 +-- .../SqliteOutboxBuilder.cs | 8 +-- src/Fluent.Brighter/ConsumerBuilder.cs | 24 +++---- .../Extensions/ConsumerBuilderExtensions.cs | 18 ++--- .../Extensions/MapperBuilderExtensions.cs | 2 +- .../InboxConfigurationBuilder.cs | 20 +++--- src/Fluent.Brighter/MapperBuilder.cs | 18 ++--- src/Fluent.Brighter/ProducerBuilder.cs | 43 ++++++----- .../RelationalDatabaseConfigurationBuilder.cs | 20 +++--- src/Fluent.Brighter/RequestHandlerBuilder.cs | 18 ++--- src/Fluent.Brighter/TransformerBuilder.cs | 8 +-- 147 files changed, 759 insertions(+), 740 deletions(-) create mode 100644 .gitattributes diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..519ed32 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,9 @@ +# Auto detect text files and perform LF normalization +* text=auto + +*.cs text diff=csharp +*.cshtml text diff=html +*.csx text diff=csharp +*.sln text eol=crlf +*.slnx text eol=crlf +*.csproj text eol=crlf diff --git a/samples/AwsTaskQueue/Program.cs b/samples/AwsTaskQueue/Program.cs index 8c40391..1382828 100644 --- a/samples/AwsTaskQueue/Program.cs +++ b/samples/AwsTaskQueue/Program.cs @@ -53,8 +53,8 @@ .SetMessagePumpType(MessagePumpType.Proactor) .SetMakeChannels(OnMissingChannel.Create)) ) - // .UseDynamoDbOutbox() - // .UseDynamoDbInbox() + // .UseDynamoDbOutbox() + // .UseDynamoDbInbox() )); }) .Build(); @@ -62,7 +62,7 @@ await host.StartAsync(); -using var cts = new CancellationTokenSource(); +using var cts = new CancellationTokenSource(); Console.CancelKeyPress += (_, _) => cts.Cancel(); diff --git a/samples/GcpSample/Program.cs b/samples/GcpSample/Program.cs index 9d49682..a4681a6 100644 --- a/samples/GcpSample/Program.cs +++ b/samples/GcpSample/Program.cs @@ -60,7 +60,7 @@ await host.StartAsync(); -using var cts = new CancellationTokenSource(); +using var cts = new CancellationTokenSource(); Console.CancelKeyPress += (_, _) => cts.Cancel(); @@ -86,4 +86,4 @@ } -await host.StopAsync(); +await host.StopAsync(); \ No newline at end of file diff --git a/samples/MongoDbSample/Program.cs b/samples/MongoDbSample/Program.cs index 88e3541..e4c166b 100644 --- a/samples/MongoDbSample/Program.cs +++ b/samples/MongoDbSample/Program.cs @@ -26,10 +26,10 @@ .UsePublications(pb => pb .AddPublication(p => p .SetTopic("greeting.event.topic") - .CreateTopicIfMissing()) + .CreateTopicIfMissing()) .AddPublication(p => p .SetTopic("farewell.event.topic") - .CreateTopicIfMissing()) + .CreateTopicIfMissing()) ) .UseSubscriptions(sb => sb .AddSubscription(s => s @@ -80,4 +80,4 @@ } -await host.StopAsync(); +await host.StopAsync(); \ No newline at end of file diff --git a/samples/RedisSample/Program.cs b/samples/RedisSample/Program.cs index 46ef1fc..f4c35c4 100644 --- a/samples/RedisSample/Program.cs +++ b/samples/RedisSample/Program.cs @@ -49,7 +49,7 @@ .SetTopic("farewell.topic") .SetQueue("farewell.queue") .SetMessagePumpType(MessagePumpType.Reactor))); - }); + }); }); }) .Build(); @@ -77,4 +77,4 @@ await process.PostAsync(new FarewellEvent(name)); } -await host.StopAsync(); +await host.StopAsync(); \ No newline at end of file diff --git a/samples/RmqTaskQueue/Mappers/FarewellEventMessageMapper.cs b/samples/RmqTaskQueue/Mappers/FarewellEventMessageMapper.cs index 86964f0..5177349 100644 --- a/samples/RmqTaskQueue/Mappers/FarewellEventMessageMapper.cs +++ b/samples/RmqTaskQueue/Mappers/FarewellEventMessageMapper.cs @@ -11,7 +11,7 @@ namespace RmqTaskQueue.Mappers; public class FarewellEventMessageMapper : IAmAMessageMapperAsync { public IRequestContext? Context { get; set; } - + public Task MapToMessageAsync(FarewellEvent request, Publication publication, CancellationToken ct = default) { var header = new MessageHeader( @@ -30,4 +30,4 @@ public Task MapToRequestAsync(Message message, CancellationToken var farewellCommand = JsonSerializer.Deserialize(message.Body.Bytes, JsonSerialisationOptions.Options)!; return Task.FromResult(farewellCommand); } -} +} \ No newline at end of file diff --git a/samples/RmqTaskQueue/Mappers/GreetingEventMessageMapper.cs b/samples/RmqTaskQueue/Mappers/GreetingEventMessageMapper.cs index 5898ca7..1304322 100644 --- a/samples/RmqTaskQueue/Mappers/GreetingEventMessageMapper.cs +++ b/samples/RmqTaskQueue/Mappers/GreetingEventMessageMapper.cs @@ -10,7 +10,7 @@ namespace RmqTaskQueue.Mappers; public class GreetingEventMessageMapper : IAmAMessageMapperAsync { public IRequestContext? Context { get; set; } - + public Task MapToMessageAsync(GreetingEvent request, Publication publication, CancellationToken ct = default) { var header = new MessageHeader(messageId: request.Id, topic: "greeting.event", messageType: MessageType.MT_EVENT); diff --git a/samples/RmqTaskQueue/Program.cs b/samples/RmqTaskQueue/Program.cs index bd86bd9..ff0330c 100644 --- a/samples/RmqTaskQueue/Program.cs +++ b/samples/RmqTaskQueue/Program.cs @@ -21,10 +21,10 @@ .UsePublications(pb => pb .AddPublication(p => p .SetTopic("greeting.event.topic") - .CreateTopicIfMissing()) + .CreateTopicIfMissing()) .AddPublication(p => p .SetTopic("farewell.event.topic") - .CreateTopicIfMissing()) + .CreateTopicIfMissing()) ) .UseSubscriptions(sb => sb .AddSubscription(s => s diff --git a/samples/RocketMqSample/Program.cs b/samples/RocketMqSample/Program.cs index 2e24a1f..b503389 100644 --- a/samples/RocketMqSample/Program.cs +++ b/samples/RocketMqSample/Program.cs @@ -36,7 +36,7 @@ )))); }) .Build(); - + await host.StartAsync(); while (true) diff --git a/samples/SqlServerSample/Program.cs b/samples/SqlServerSample/Program.cs index 9340716..298bc46 100644 --- a/samples/SqlServerSample/Program.cs +++ b/samples/SqlServerSample/Program.cs @@ -116,8 +116,8 @@ [Topic] ASC .UseOutboxSweeper() .UsingMicrosoftSqlServer(cfg => { - cfg.SetConnection(new RelationalDatabaseConfiguration(ConnectionString, - databaseName: "BrighterTests", + cfg.SetConnection(new RelationalDatabaseConfiguration(ConnectionString, + databaseName: "BrighterTests", queueStoreTable: "QueueData")); cfg @@ -134,7 +134,7 @@ [Topic] ASC .AddSubscription(s => s .SetQueue("farewell.queue") .SetMessagePumpType(MessagePumpType.Reactor))); - }); + }); }); }) .Build(); @@ -162,4 +162,4 @@ [Topic] ASC await process.PostAsync(new FarewellEvent(name)); } -await host.StopAsync(); +await host.StopAsync(); \ No newline at end of file diff --git a/src/Fluent.Brighter.AWS.V4/Extensions/SchedulerFactoryBuilderExtensions.cs b/src/Fluent.Brighter.AWS.V4/Extensions/SchedulerFactoryBuilderExtensions.cs index 254268a..4bc2af1 100644 --- a/src/Fluent.Brighter.AWS.V4/Extensions/SchedulerFactoryBuilderExtensions.cs +++ b/src/Fluent.Brighter.AWS.V4/Extensions/SchedulerFactoryBuilderExtensions.cs @@ -28,7 +28,7 @@ public static SchedulerFactoryBuilder SetConnection(this SchedulerFactoryBuilder } #region Group - + /// /// Sets the scheduler group configuration using a builder pattern for fluent configuration. /// @@ -81,7 +81,7 @@ public static SchedulerFactoryBuilder DisableMessageTopicAsTarget(this Scheduler #endregion #region On conflict - + /// /// Configures the scheduler to throw an exception when scheduling conflicts occur. /// @@ -105,7 +105,7 @@ public static SchedulerFactoryBuilder OverwriteOnConflict(this SchedulerFactoryB #endregion #region On missing role - + /// /// Configures the scheduler to assume the IAM role exists (no validation or creation). /// @@ -137,4 +137,4 @@ public static SchedulerFactoryBuilder ValidateRoleIfMissing(this SchedulerFactor } #endregion -} +} \ No newline at end of file diff --git a/src/Fluent.Brighter.AWS.V4/SchedulerFactoryBuilder.cs b/src/Fluent.Brighter.AWS.V4/SchedulerFactoryBuilder.cs index b52fce1..cd40f17 100644 --- a/src/Fluent.Brighter.AWS.V4/SchedulerFactoryBuilder.cs +++ b/src/Fluent.Brighter.AWS.V4/SchedulerFactoryBuilder.cs @@ -40,7 +40,7 @@ public SchedulerFactoryBuilder SetRole(string role) } private TimeProvider _timeProvider = TimeProvider.System; - + /// /// Sets the time provider for scheduling operations, allowing for custom time sources /// in testing scenarios or for time synchronization requirements. @@ -54,7 +54,7 @@ public SchedulerFactoryBuilder SetTimeProvider(TimeProvider timeProvider) } private SchedulerGroup _group = new(); - + /// /// Sets the scheduler group for organizing and managing related schedules. /// @@ -67,7 +67,7 @@ public SchedulerFactoryBuilder SetGroup(SchedulerGroup group) } private Func _getOrCreteMessageSchedulerId = static _ => Uuid.New().ToString("N"); - + /// /// Sets the function to generate or retrieve a unique scheduler ID for messages. /// @@ -80,7 +80,7 @@ public SchedulerFactoryBuilder SetGetOrCreateMessageSchedulerId(Func _getOrCreteRequestSchedulerId = static _ => Uuid.New().ToString("N"); - + /// /// Sets the function to generate or retrieve a unique scheduler ID for requests. /// @@ -93,7 +93,7 @@ public SchedulerFactoryBuilder SetGetOrCreateRequestSchedulerId(Func /// Sets the flexible time window in minutes for schedule execution, which allows /// AWS to execute the schedule within the specified window for better resource utilization. @@ -107,7 +107,7 @@ public SchedulerFactoryBuilder SetFlexibleTimeWindowMinutes(int? flexibleTimeWin } private RoutingKey _schedulerTopicOrQueue = RoutingKey.Empty; - + /// /// Sets the topic or queue where scheduled messages will be delivered. /// @@ -120,7 +120,7 @@ public SchedulerFactoryBuilder SetSchedulerTopicOrQueue(RoutingKey schedulerTopi } private bool _useMessageTopicAsTarget = true; - + /// /// Sets whether to use the message's topic as the target for scheduled delivery. /// @@ -133,7 +133,7 @@ public SchedulerFactoryBuilder SetMessageTopicAsTarget(bool useMessageTopicAsTar } private OnSchedulerConflict _onConflict; - + /// /// Sets the conflict resolution strategy when scheduling conflicts occur. /// @@ -146,7 +146,7 @@ public SchedulerFactoryBuilder SetOnConflict(OnSchedulerConflict onConflict) } private OnMissingRole _missingRole = OnMissingRole.Assume; - + /// /// Sets the behavior when the specified IAM role is missing. /// diff --git a/src/Fluent.Brighter.AWS.V4/SchedulerGroupBuilder.cs b/src/Fluent.Brighter.AWS.V4/SchedulerGroupBuilder.cs index df76b46..4fc1eec 100644 --- a/src/Fluent.Brighter.AWS.V4/SchedulerGroupBuilder.cs +++ b/src/Fluent.Brighter.AWS.V4/SchedulerGroupBuilder.cs @@ -14,7 +14,7 @@ namespace Fluent.Brighter.AWS.V4; public class SchedulerGroupBuilder { private string _name = "default"; - + /// /// Sets the name of the scheduler group for organizing related schedules. /// @@ -27,7 +27,7 @@ public SchedulerGroupBuilder SetName(string name) } private List _tags = [new Tag { Key = "Source", Value = "Brighter" }]; - + /// /// Sets the tags for the scheduler group, which help with organization, /// cost allocation, and access control in AWS. @@ -52,7 +52,7 @@ public SchedulerGroupBuilder AddTag(Tag tag) } private OnMissingSchedulerGroup _makeSchedulerGroup = OnMissingSchedulerGroup.Assume; - + /// /// Sets the behavior when the scheduler group doesn't exist. /// diff --git a/src/Fluent.Brighter.AWS/Extensions/SchedulerFactoryBuilderExtensions.cs b/src/Fluent.Brighter.AWS/Extensions/SchedulerFactoryBuilderExtensions.cs index 12b7861..e09cf8a 100644 --- a/src/Fluent.Brighter.AWS/Extensions/SchedulerFactoryBuilderExtensions.cs +++ b/src/Fluent.Brighter.AWS/Extensions/SchedulerFactoryBuilderExtensions.cs @@ -29,7 +29,7 @@ public static SchedulerFactoryBuilder SetConnection(this SchedulerFactoryBuilder } #region Group - + /// /// Sets the scheduler group configuration using a builder pattern for fluent configuration. /// @@ -82,7 +82,7 @@ public static SchedulerFactoryBuilder DisableMessageTopicAsTarget(this Scheduler #endregion #region On conflict - + /// /// Configures the scheduler to throw an exception when scheduling conflicts occur. /// @@ -106,7 +106,7 @@ public static SchedulerFactoryBuilder OverwriteOnConflict(this SchedulerFactoryB #endregion #region On missing role - + /// /// Configures the scheduler to assume the IAM role exists (no validation or creation). /// @@ -138,4 +138,4 @@ public static SchedulerFactoryBuilder ValidateRoleIfMissing(this SchedulerFactor } #endregion -} +} \ No newline at end of file diff --git a/src/Fluent.Brighter.AWS/SchedulerFactoryBuilder.cs b/src/Fluent.Brighter.AWS/SchedulerFactoryBuilder.cs index c4876ad..71f9b79 100644 --- a/src/Fluent.Brighter.AWS/SchedulerFactoryBuilder.cs +++ b/src/Fluent.Brighter.AWS/SchedulerFactoryBuilder.cs @@ -40,7 +40,7 @@ public SchedulerFactoryBuilder SetRole(string role) } private TimeProvider _timeProvider = TimeProvider.System; - + /// /// Sets the time provider for scheduling operations, allowing for custom time sources /// in testing scenarios or for time synchronization requirements. @@ -54,7 +54,7 @@ public SchedulerFactoryBuilder SetTimeProvider(TimeProvider timeProvider) } private SchedulerGroup _group = new(); - + /// /// Sets the scheduler group for organizing and managing related schedules. /// @@ -67,7 +67,7 @@ public SchedulerFactoryBuilder SetGroup(SchedulerGroup group) } private Func _getOrCreteMessageSchedulerId = static _ => Uuid.New().ToString("N"); - + /// /// Sets the function to generate or retrieve a unique scheduler ID for messages. /// @@ -80,7 +80,7 @@ public SchedulerFactoryBuilder SetGetOrCreateMessageSchedulerId(Func _getOrCreteRequestSchedulerId = static _ => Uuid.New().ToString("N"); - + /// /// Sets the function to generate or retrieve a unique scheduler ID for requests. /// @@ -93,7 +93,7 @@ public SchedulerFactoryBuilder SetGetOrCreateRequestSchedulerId(Func /// Sets the flexible time window in minutes for schedule execution, which allows /// AWS to execute the schedule within the specified window for better resource utilization. @@ -107,7 +107,7 @@ public SchedulerFactoryBuilder SetFlexibleTimeWindowMinutes(int? flexibleTimeWin } private RoutingKey _schedulerTopicOrQueue = RoutingKey.Empty; - + /// /// Sets the topic or queue where scheduled messages will be delivered. /// @@ -120,7 +120,7 @@ public SchedulerFactoryBuilder SetSchedulerTopicOrQueue(RoutingKey schedulerTopi } private bool _useMessageTopicAsTarget = true; - + /// /// Sets whether to use the message's topic as the target for scheduled delivery. /// @@ -133,7 +133,7 @@ public SchedulerFactoryBuilder SetMessageTopicAsTarget(bool useMessageTopicAsTar } private OnSchedulerConflict _onConflict; - + /// /// Sets the conflict resolution strategy when scheduling conflicts occur. /// @@ -146,7 +146,7 @@ public SchedulerFactoryBuilder SetOnConflict(OnSchedulerConflict onConflict) } private OnMissingRole _missingRole = OnMissingRole.Assume; - + /// /// Sets the behavior when the specified IAM role is missing. /// diff --git a/src/Fluent.Brighter.AWS/SchedulerGroupBuilder.cs b/src/Fluent.Brighter.AWS/SchedulerGroupBuilder.cs index dc9af92..9665340 100644 --- a/src/Fluent.Brighter.AWS/SchedulerGroupBuilder.cs +++ b/src/Fluent.Brighter.AWS/SchedulerGroupBuilder.cs @@ -14,7 +14,7 @@ namespace Fluent.Brighter.AWS; public class SchedulerGroupBuilder { private string _name = "default"; - + /// /// Sets the name of the scheduler group for organizing related schedules. /// @@ -27,7 +27,7 @@ public SchedulerGroupBuilder SetName(string name) } private List _tags = [new Tag { Key = "Source", Value = "Brighter" }]; - + /// /// Sets the tags for the scheduler group, which help with organization, /// cost allocation, and access control in AWS. @@ -52,7 +52,7 @@ public SchedulerGroupBuilder AddTag(Tag tag) } private OnMissingSchedulerGroup _makeSchedulerGroup = OnMissingSchedulerGroup.Assume; - + /// /// Sets the behavior when the scheduler group doesn't exist. /// diff --git a/src/Fluent.Brighter.GoogleCloud/Extensions/ConsumerBuilderExtensions.cs b/src/Fluent.Brighter.GoogleCloud/Extensions/ConsumerBuilderExtensions.cs index b07651a..690d063 100644 --- a/src/Fluent.Brighter.GoogleCloud/Extensions/ConsumerBuilderExtensions.cs +++ b/src/Fluent.Brighter.GoogleCloud/Extensions/ConsumerBuilderExtensions.cs @@ -1,10 +1,13 @@ using System; + using Fluent.Brighter.GoogleCloud; + using Paramore.Brighter; using Paramore.Brighter.Firestore; using Paramore.Brighter.Inbox.Firestore; using Paramore.Brighter.Inbox.Spanner; using Paramore.Brighter.MessagingGateway.GcpPubSub; + using SpannerInboxBuilder = Fluent.Brighter.GoogleCloud.SpannerInboxBuilder; namespace Fluent.Brighter; @@ -173,4 +176,4 @@ public static ConsumerBuilder UseSpannerInbox(this ConsumerBuilder builder, Span { return builder.SetInbox(cfg => cfg.SetInbox(inbox)); } -} +} \ No newline at end of file diff --git a/src/Fluent.Brighter.GoogleCloud/Extensions/FirestoreConfigurationBuilderExtensions.cs b/src/Fluent.Brighter.GoogleCloud/Extensions/FirestoreConfigurationBuilderExtensions.cs index 0b3d1d2..6260167 100644 --- a/src/Fluent.Brighter.GoogleCloud/Extensions/FirestoreConfigurationBuilderExtensions.cs +++ b/src/Fluent.Brighter.GoogleCloud/Extensions/FirestoreConfigurationBuilderExtensions.cs @@ -17,12 +17,12 @@ public static class FirestoreConfigurationBuilderExtensions /// The name of the inbox collection /// The Firestore configuration builder instance for method chaining public static FirestoreConfigurationBuilder SetInbox( - this FirestoreConfigurationBuilder builder, + this FirestoreConfigurationBuilder builder, string tableName) { return builder.SetInbox(c => c.SetName(tableName)); } - + /// /// Sets the inbox Firestore collection using a fluent configuration callback. /// @@ -30,14 +30,14 @@ public static FirestoreConfigurationBuilder SetInbox( /// An action to configure the inbox collection builder /// The Firestore configuration builder instance for method chaining public static FirestoreConfigurationBuilder SetInbox( - this FirestoreConfigurationBuilder builder, + this FirestoreConfigurationBuilder builder, Action configure) { var collection = new FirestoreCollectionBuilder(); configure(collection); return builder.SetInbox(collection.Build()); } - + /// /// Sets the outbox Firestore collection name. /// @@ -45,12 +45,12 @@ public static FirestoreConfigurationBuilder SetInbox( /// The name of the outbox collection /// The Firestore configuration builder instance for method chaining public static FirestoreConfigurationBuilder SetOutbox( - this FirestoreConfigurationBuilder builder, + this FirestoreConfigurationBuilder builder, string tableName) { return builder.SetOutbox(c => c.SetName(tableName)); } - + /// /// Sets the outbox Firestore collection using a fluent configuration callback. /// @@ -58,14 +58,14 @@ public static FirestoreConfigurationBuilder SetOutbox( /// An action to configure the outbox collection builder /// The Firestore configuration builder instance for method chaining public static FirestoreConfigurationBuilder SetOutbox( - this FirestoreConfigurationBuilder builder, + this FirestoreConfigurationBuilder builder, Action configure) { var collection = new FirestoreCollectionBuilder(); configure(collection); return builder.SetOutbox(collection.Build()); } - + /// /// Sets the locking Firestore collection name. /// @@ -73,12 +73,12 @@ public static FirestoreConfigurationBuilder SetOutbox( /// The name of the locking collection /// The Firestore configuration builder instance for method chaining public static FirestoreConfigurationBuilder SetLocking( - this FirestoreConfigurationBuilder builder, + this FirestoreConfigurationBuilder builder, string tableName) { return builder.SetLocking(c => c.SetName(tableName)); } - + /// /// Sets the locking Firestore collection using a fluent configuration callback. /// @@ -86,7 +86,7 @@ public static FirestoreConfigurationBuilder SetLocking( /// An action to configure the locking collection builder /// The Firestore configuration builder instance for method chaining public static FirestoreConfigurationBuilder SetLocking( - this FirestoreConfigurationBuilder builder, + this FirestoreConfigurationBuilder builder, Action configure) { var collection = new FirestoreCollectionBuilder(); diff --git a/src/Fluent.Brighter.GoogleCloud/Extensions/GcpPubSubSubscriptionBuilderExtensions.cs b/src/Fluent.Brighter.GoogleCloud/Extensions/GcpPubSubSubscriptionBuilderExtensions.cs index b835a84..0ccea51 100644 --- a/src/Fluent.Brighter.GoogleCloud/Extensions/GcpPubSubSubscriptionBuilderExtensions.cs +++ b/src/Fluent.Brighter.GoogleCloud/Extensions/GcpPubSubSubscriptionBuilderExtensions.cs @@ -49,7 +49,7 @@ public static GcpPubSubSubscriptionBuilder EnableMessageOrdering(this GcpPubSubS { return builder.SetEnableMessageOrdering(true); } - + /// /// Disables message ordering for the subscription. /// Messages will be delivered in the order received by Pub/Sub, which may not match publishing order. @@ -60,7 +60,7 @@ public static GcpPubSubSubscriptionBuilder DisableMessageOrdering(this GcpPubSub { return builder.SetEnableMessageOrdering(false); } - + /// /// Enables exactly-once delivery for the subscription. /// When enabled, Pub/Sub guarantees that each message is delivered and acknowledged exactly once, @@ -72,7 +72,7 @@ public static GcpPubSubSubscriptionBuilder EnableExactlyOnceDelivery(this GcpPub { return builder.SetEnableExactlyOnceDelivery(true); } - + /// /// Disables exactly-once delivery for the subscription. /// Messages may be delivered more than once (at-least-once delivery semantics). @@ -96,7 +96,7 @@ public static GcpPubSubSubscriptionBuilder UseStreamMode(this GcpPubSubSubscript { return builder.SetSubscriptionMode(SubscriptionMode.Stream); } - + /// /// Configures the subscription to use pull mode for message consumption. /// In pull mode, the subscriber explicitly requests messages from Pub/Sub, @@ -134,7 +134,7 @@ public static GcpPubSubSubscriptionBuilder SetDeadLetter(this GcpPubSubSubscript configure(policy); return builder.SetDeadLetter(policy.Build()); } - + /// /// Configures the subscription to use the Proactor message pump type for asynchronous message processing. /// The Proactor pattern processes messages using async/await, allowing for concurrent message handling diff --git a/src/Fluent.Brighter.GoogleCloud/Extensions/GcpPublicationBuilderExtensions.cs b/src/Fluent.Brighter.GoogleCloud/Extensions/GcpPublicationBuilderExtensions.cs index 441cbff..b6ba146 100644 --- a/src/Fluent.Brighter.GoogleCloud/Extensions/GcpPublicationBuilderExtensions.cs +++ b/src/Fluent.Brighter.GoogleCloud/Extensions/GcpPublicationBuilderExtensions.cs @@ -100,4 +100,4 @@ public static GcpPublicationBuilder AssumeQueueExists(this GcpPublicationBuilder { return builder.SetMakeChannels(OnMissingChannel.Assume); } -} +} \ No newline at end of file diff --git a/src/Fluent.Brighter.GoogleCloud/Extensions/GcpPublicationFactoryBuilderExtensions.cs b/src/Fluent.Brighter.GoogleCloud/Extensions/GcpPublicationFactoryBuilderExtensions.cs index af2b157..e86323c 100644 --- a/src/Fluent.Brighter.GoogleCloud/Extensions/GcpPublicationFactoryBuilderExtensions.cs +++ b/src/Fluent.Brighter.GoogleCloud/Extensions/GcpPublicationFactoryBuilderExtensions.cs @@ -32,7 +32,7 @@ public static GcpPublicationFactoryBuilder SetConnection(this GcpPublicationFact configure(connection); return builder.SetConnection(connection.Build()); } - + /// /// Adds a message publication configuration to the Google Cloud Pub/Sub message producer factory. /// This overload allows configuring publication settings using a builder action without specifying a request type. @@ -54,7 +54,7 @@ public static GcpPublicationFactoryBuilder AddPublication(this GcpPublicationFac configure(connection); return builder.AddPublication(connection.Build()); } - + /// /// Adds a message publication configuration to the Google Cloud Pub/Sub message producer factory for a specific request type. /// This overload automatically associates the publication with the specified request type using generics. diff --git a/src/Fluent.Brighter.GoogleCloud/Extensions/LuggageStoreBuilderExtensions.cs b/src/Fluent.Brighter.GoogleCloud/Extensions/LuggageStoreBuilderExtensions.cs index c5e5906..cdb52b2 100644 --- a/src/Fluent.Brighter.GoogleCloud/Extensions/LuggageStoreBuilderExtensions.cs +++ b/src/Fluent.Brighter.GoogleCloud/Extensions/LuggageStoreBuilderExtensions.cs @@ -24,7 +24,7 @@ public static LuggageStoreBuilder UseGcsLuggageStore(this LuggageStoreBuilder bu configure(store); return builder; } - + /// /// Configures the luggage store to use a pre-configured Google Cloud Storage (GCS) luggage store instance. /// diff --git a/src/Fluent.Brighter.GoogleCloud/Extensions/ProducerExtensions.cs b/src/Fluent.Brighter.GoogleCloud/Extensions/ProducerExtensions.cs index bfa8e58..299a8f6 100644 --- a/src/Fluent.Brighter.GoogleCloud/Extensions/ProducerExtensions.cs +++ b/src/Fluent.Brighter.GoogleCloud/Extensions/ProducerExtensions.cs @@ -188,5 +188,5 @@ public static ProducerBuilder UseFirestoreDistributedLock(this ProducerBuilder b } #endregion - + } \ No newline at end of file diff --git a/src/Fluent.Brighter.GoogleCloud/Extensions/SpannerOutboxBuilderExtensions.cs b/src/Fluent.Brighter.GoogleCloud/Extensions/SpannerOutboxBuilderExtensions.cs index fbfd428..45891c9 100644 --- a/src/Fluent.Brighter.GoogleCloud/Extensions/SpannerOutboxBuilderExtensions.cs +++ b/src/Fluent.Brighter.GoogleCloud/Extensions/SpannerOutboxBuilderExtensions.cs @@ -15,7 +15,7 @@ public static class SpannerOutboxBuilderExtensions /// The Spanner outbox builder instance. /// An action to configure the relational database settings. /// The configured instance for method chaining. - public static SpannerOutboxBuilder SetConfiguration(this SpannerOutboxBuilder builder, + public static SpannerOutboxBuilder SetConfiguration(this SpannerOutboxBuilder builder, Action configure) { var configuration = new RelationalDatabaseConfigurationBuilder(); diff --git a/src/Fluent.Brighter.GoogleCloud/FirestoreCollectionBuilder.cs b/src/Fluent.Brighter.GoogleCloud/FirestoreCollectionBuilder.cs index 3f0fcd4..f293837 100644 --- a/src/Fluent.Brighter.GoogleCloud/FirestoreCollectionBuilder.cs +++ b/src/Fluent.Brighter.GoogleCloud/FirestoreCollectionBuilder.cs @@ -49,5 +49,4 @@ public FirestoreCollection Build() Ttl = _ttl }; } -} - +} \ No newline at end of file diff --git a/src/Fluent.Brighter.GoogleCloud/FirestoreConfigurationBuilder.cs b/src/Fluent.Brighter.GoogleCloud/FirestoreConfigurationBuilder.cs index c11965a..c1afb24 100644 --- a/src/Fluent.Brighter.GoogleCloud/FirestoreConfigurationBuilder.cs +++ b/src/Fluent.Brighter.GoogleCloud/FirestoreConfigurationBuilder.cs @@ -164,5 +164,4 @@ internal FirestoreConfiguration Build() Configure = _configure }; } -} - +} \ No newline at end of file diff --git a/src/Fluent.Brighter.GoogleCloud/FirestoreLockingBuilder.cs b/src/Fluent.Brighter.GoogleCloud/FirestoreLockingBuilder.cs index 0c50737..26229fd 100644 --- a/src/Fluent.Brighter.GoogleCloud/FirestoreLockingBuilder.cs +++ b/src/Fluent.Brighter.GoogleCloud/FirestoreLockingBuilder.cs @@ -11,7 +11,7 @@ namespace Fluent.Brighter.GoogleCloud; public class FirestoreLockingBuilder { private IAmAFirestoreConnectionProvider? _connectionProvider; - + /// /// Sets the Firestore connection provider. /// @@ -22,9 +22,9 @@ public FirestoreLockingBuilder SetConnectionProvider(IAmAFirestoreConnectionProv _connectionProvider = connectionProvider; return this; } - + private FirestoreConfiguration? _configuration; - + /// /// Sets the Firestore configuration. /// diff --git a/src/Fluent.Brighter.GoogleCloud/FirestoreOutboxBuilder.cs b/src/Fluent.Brighter.GoogleCloud/FirestoreOutboxBuilder.cs index 7769151..cca9b3b 100644 --- a/src/Fluent.Brighter.GoogleCloud/FirestoreOutboxBuilder.cs +++ b/src/Fluent.Brighter.GoogleCloud/FirestoreOutboxBuilder.cs @@ -11,7 +11,7 @@ namespace Fluent.Brighter.GoogleCloud; public sealed class FirestoreOutboxBuilder { private FirestoreConfiguration? _configuration; - + /// /// Sets the Firestore configuration containing project ID, database, and collection settings. /// @@ -37,7 +37,7 @@ public FirestoreOutboxBuilder SetConnectionProvider(IAmAFirestoreConnectionProvi _firestoreConnectionProvider = connectionProvider; return this; } - + /// /// Builds the FirestoreOutbox instance with the configured options. /// diff --git a/src/Fluent.Brighter.GoogleCloud/GcpConfigurator.cs b/src/Fluent.Brighter.GoogleCloud/GcpConfigurator.cs index 01ea2b1..572aaae 100644 --- a/src/Fluent.Brighter.GoogleCloud/GcpConfigurator.cs +++ b/src/Fluent.Brighter.GoogleCloud/GcpConfigurator.cs @@ -29,7 +29,7 @@ public GcpConfigurator SetConnection(GcpMessagingGatewayConnection connection) _connection = connection; return this; } - + /// /// Sets the GCP messaging gateway connection using a builder. /// @@ -132,15 +132,15 @@ public GcpConfigurator SetFirestoreConfiguration(string database) { throw new ConfigurationException("Google Cloud Project ID was not set. Use SetConfiguration() to configure."); } - + _firestoreConfiguration = new FirestoreConfiguration(_connection.ProjectId, database) { Credential = _connection.Credential }; - + return this; } - + /// /// Sets the Firestore configuration using a builder. /// @@ -153,16 +153,16 @@ public GcpConfigurator SetFirestoreConfiguration(Action /// Sets the Firestore configuration. /// @@ -219,7 +219,7 @@ public GcpConfigurator UseFirestoreInbox(Action configure return this; } - + /// /// Configures Firestore as the inbox store with custom configuration. /// The inbox pattern ensures idempotent message processing by tracking received messages. @@ -288,7 +288,7 @@ public GcpConfigurator UseFirestoreOutbox(Action configu return this; } - + /// /// Configures Firestore as the outbox store with custom configuration. /// The outbox pattern ensures reliable message publishing by storing messages before sending. @@ -421,7 +421,7 @@ public GcpConfigurator UseFirestoreDistributedLock(Action /// Configures Firestore for distributed locking with custom configuration. /// Distributed locks prevent concurrent processing of the same message across multiple instances. diff --git a/src/Fluent.Brighter.GoogleCloud/GcpMessagingGatewayConnectionBuilder.cs b/src/Fluent.Brighter.GoogleCloud/GcpMessagingGatewayConnectionBuilder.cs index 1e39452..6f1c5a3 100644 --- a/src/Fluent.Brighter.GoogleCloud/GcpMessagingGatewayConnectionBuilder.cs +++ b/src/Fluent.Brighter.GoogleCloud/GcpMessagingGatewayConnectionBuilder.cs @@ -3,6 +3,7 @@ using Google.Apis.Auth.OAuth2; using Google.Cloud.PubSub.V1; using Google.Cloud.ResourceManager.V3; + using Paramore.Brighter.MessagingGateway.GcpPubSub; namespace Fluent.Brighter.GoogleCloud; @@ -14,7 +15,7 @@ namespace Fluent.Brighter.GoogleCloud; public class GcpMessagingGatewayConnectionBuilder { private ICredential? _credential; - + /// /// Sets the to use for authentication with Google Cloud Pub/Sub. /// @@ -25,9 +26,9 @@ public GcpMessagingGatewayConnectionBuilder SetCredential(ICredential credential _credential = credential; return this; } - + private string _projectId = string.Empty; - + /// /// Sets the Google Cloud project ID. /// @@ -38,9 +39,9 @@ public GcpMessagingGatewayConnectionBuilder SetProjectId(string projectId) _projectId = projectId; return this; } - + private Action? _topicManagerConfiguration; - + /// /// Sets an action to configure the used for topic management. /// @@ -51,9 +52,9 @@ public GcpMessagingGatewayConnectionBuilder SetTopicManagerConfiguration(Action< _topicManagerConfiguration = configure; return this; } - + private Action? _publisherConfiguration; - + /// /// Sets an action to configure the used to publish messages to a topic. /// @@ -64,9 +65,9 @@ public GcpMessagingGatewayConnectionBuilder SetPublisherConfiguration(Action? _subscriptionManagerConfiguration; - + /// /// Sets an action to configure the used for subscription management. /// @@ -77,9 +78,9 @@ public GcpMessagingGatewayConnectionBuilder SetSubscriptionManagerConfiguration( _subscriptionManagerConfiguration = configure; return this; } - + private Action? _streamConfiguration; - + /// /// Sets an action to configure the used for pull mode message consumption. /// @@ -90,9 +91,9 @@ public GcpMessagingGatewayConnectionBuilder SetStreamConfiguration(Action? _projectsClientConfiguration; - + /// /// Sets an action to configure the used for managing projects. /// @@ -103,7 +104,7 @@ public GcpMessagingGatewayConnectionBuilder SetProjectsClientConfiguration(Actio _projectsClientConfiguration = configure; return this; } - + /// /// Builds the with the configured settings. /// @@ -115,7 +116,7 @@ internal GcpMessagingGatewayConnection Build() { throw new InvalidOperationException("Project ID must be set before building the connection."); } - + return new GcpMessagingGatewayConnection { Credential = _credential, diff --git a/src/Fluent.Brighter.GoogleCloud/GcpPubSubSubscriptionBuilder.cs b/src/Fluent.Brighter.GoogleCloud/GcpPubSubSubscriptionBuilder.cs index f95c218..489c599 100644 --- a/src/Fluent.Brighter.GoogleCloud/GcpPubSubSubscriptionBuilder.cs +++ b/src/Fluent.Brighter.GoogleCloud/GcpPubSubSubscriptionBuilder.cs @@ -2,6 +2,7 @@ using Google.Cloud.PubSub.V1; using Google.Protobuf.Collections; + using Paramore.Brighter; using Paramore.Brighter.MessagingGateway.GcpPubSub; @@ -32,7 +33,7 @@ public GcpPubSubSubscriptionBuilder SetSubscriptionName(SubscriptionName subscri { _channelName = new ChannelName(_subscriptionName.Value); } - + return this; } @@ -51,7 +52,7 @@ public GcpPubSubSubscriptionBuilder SetSubscription(ChannelName channelName) { _subscriptionName = new SubscriptionName(channelName.Value); } - + return this; } diff --git a/src/Fluent.Brighter.GoogleCloud/GcpPublicationBuilder.cs b/src/Fluent.Brighter.GoogleCloud/GcpPublicationBuilder.cs index 5cf1b49..5dde38d 100644 --- a/src/Fluent.Brighter.GoogleCloud/GcpPublicationBuilder.cs +++ b/src/Fluent.Brighter.GoogleCloud/GcpPublicationBuilder.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using Google.Cloud.PubSub.V1; + using Paramore.Brighter; using Paramore.Brighter.MessagingGateway.GcpPubSub; diff --git a/src/Fluent.Brighter.GoogleCloud/GcpPublicationFactoryBuilder.cs b/src/Fluent.Brighter.GoogleCloud/GcpPublicationFactoryBuilder.cs index 5093230..abb877d 100644 --- a/src/Fluent.Brighter.GoogleCloud/GcpPublicationFactoryBuilder.cs +++ b/src/Fluent.Brighter.GoogleCloud/GcpPublicationFactoryBuilder.cs @@ -14,7 +14,7 @@ namespace Fluent.Brighter.GoogleCloud; public class GcpPublicationFactoryBuilder { private GcpMessagingGatewayConnection? _connection; - + /// /// Sets the connection details for the Google Cloud Pub/Sub gateway. /// @@ -27,7 +27,7 @@ public GcpPublicationFactoryBuilder SetConnection(GcpMessagingGatewayConnection } private List _publications = new(); - + /// /// Sets the collection of Google Cloud Pub/Sub specific publication configurations. /// Replaces any previously configured publications. @@ -51,9 +51,9 @@ public GcpPublicationFactoryBuilder AddPublication(GcpPublication publication) _publications.Add(publication); return this; } - + private InstrumentationOptions? _instrumentation; - + /// /// Sets the instrumentation options for tracing and metrics. /// diff --git a/src/Fluent.Brighter.GoogleCloud/GcsLuggageStoreBuilder.cs b/src/Fluent.Brighter.GoogleCloud/GcsLuggageStoreBuilder.cs index cb44d54..280f580 100644 --- a/src/Fluent.Brighter.GoogleCloud/GcsLuggageStoreBuilder.cs +++ b/src/Fluent.Brighter.GoogleCloud/GcsLuggageStoreBuilder.cs @@ -142,7 +142,7 @@ public GcsLuggageStoreBuilder SetDeleteObjectOptions(DeleteObjectOptions options _deleteObjectOptions = options; return this; } - + private GetObjectOptions? _getObjectOptions; /// @@ -218,7 +218,7 @@ internal GcsLuggageStore Build() CreateBucketOptions = _createBucketOptions, DeleteObjectOptions = _deleteObjectOptions, DownloadObjectOptions = _downloadObjectOptions, - GetBucketOptions = _getBucketOptions, + GetBucketOptions = _getBucketOptions, GetObjectOptions = _getObjectOptions, Prefix = _prefix, ProjectId = _projectId, diff --git a/src/Fluent.Brighter.GoogleCloud/PubSubSubscriptionConfigurator.cs b/src/Fluent.Brighter.GoogleCloud/PubSubSubscriptionConfigurator.cs index 9353275..923e948 100644 --- a/src/Fluent.Brighter.GoogleCloud/PubSubSubscriptionConfigurator.cs +++ b/src/Fluent.Brighter.GoogleCloud/PubSubSubscriptionConfigurator.cs @@ -17,7 +17,7 @@ public class PubSubSubscriptionConfigurator(GcpPubSubChannelFactory channelFacto /// Gets the internal list of configured GCP Pub/Sub subscriptions. /// internal List Subscriptions { get; } = []; - + /// /// Adds a pre-configured GCP Pub/Sub subscription to the configurator. /// diff --git a/src/Fluent.Brighter.GoogleCloud/SpannerOutboxBuilder.cs b/src/Fluent.Brighter.GoogleCloud/SpannerOutboxBuilder.cs index f64ed3c..50f53c2 100644 --- a/src/Fluent.Brighter.GoogleCloud/SpannerOutboxBuilder.cs +++ b/src/Fluent.Brighter.GoogleCloud/SpannerOutboxBuilder.cs @@ -34,7 +34,7 @@ public SpannerOutboxBuilder SetConnectionProvider(IAmARelationalDbConnectionProv _connectionProvider = connectionProvider; return this; } - + /// /// Builds a new instance of using the configured settings. /// @@ -46,8 +46,8 @@ internal SpannerOutbox Build() { throw new ConfigurationException("Configuration is null"); } - - return _connectionProvider == null ? new SpannerOutbox(_configuration) + + return _connectionProvider == null ? new SpannerOutbox(_configuration) : new SpannerOutbox(_configuration, _connectionProvider); } } \ No newline at end of file diff --git a/src/Fluent.Brighter.Kafka/Extensions/ConsumerBuilderExtensions.cs b/src/Fluent.Brighter.Kafka/Extensions/ConsumerBuilderExtensions.cs index 62371ac..a89166b 100644 --- a/src/Fluent.Brighter.Kafka/Extensions/ConsumerBuilderExtensions.cs +++ b/src/Fluent.Brighter.Kafka/Extensions/ConsumerBuilderExtensions.cs @@ -22,21 +22,21 @@ public static class ConsumerBuilderExtensions /// The consumer builder for chaining. public static ConsumerBuilder AddKafkaSubscription(this ConsumerBuilder builder, KafkaSubscription subscription) => builder.AddSubscription(subscription); - + /// /// Adds a Kafka subscription by configuring it through a builder action. /// /// The Brighter consumer builder instance. /// An action that configures a . /// The consumer builder for chaining. - public static ConsumerBuilder AddKafkaSubscription(this ConsumerBuilder builder, + public static ConsumerBuilder AddKafkaSubscription(this ConsumerBuilder builder, Action configure) { var sub = new KafkaSubscriptionBuilder(); configure(sub); return builder.AddSubscription(sub.Build()); } - + /// /// Adds a Kafka subscription for a specific request type with type-safe configuration. /// The request type is automatically registered, and additional settings can be applied. @@ -45,7 +45,7 @@ public static ConsumerBuilder AddKafkaSubscription(this ConsumerBuilder builder, /// The Brighter consumer builder instance. /// An action to further configure the subscription builder. /// The consumer builder for chaining. - public static ConsumerBuilder AddKafkaSubscription(this ConsumerBuilder builder, + public static ConsumerBuilder AddKafkaSubscription(this ConsumerBuilder builder, Action configure) where TRequest : class, IRequest { @@ -68,7 +68,7 @@ public static ConsumerBuilder AddKafkaChannelFactory(this ConsumerBuilder builde configure(connection); return builder.AddKafkaChannelFactory(connection.Build()); } - + /// /// Adds a Kafka channel factory using a pre-built connection configuration. /// @@ -80,4 +80,4 @@ public static ConsumerBuilder AddKafkaChannelFactory(this ConsumerBuilder builde return builder .AddChannelFactory(new ChannelFactory(new KafkaMessageConsumerFactory(connection))); } -} +} \ No newline at end of file diff --git a/src/Fluent.Brighter.Kafka/Extensions/KafkaMessageProducerFactoryBuilderExtensions.cs b/src/Fluent.Brighter.Kafka/Extensions/KafkaMessageProducerFactoryBuilderExtensions.cs index d144777..7deeb64 100644 --- a/src/Fluent.Brighter.Kafka/Extensions/KafkaMessageProducerFactoryBuilderExtensions.cs +++ b/src/Fluent.Brighter.Kafka/Extensions/KafkaMessageProducerFactoryBuilderExtensions.cs @@ -24,7 +24,7 @@ public static KafkaMessageProducerFactoryBuilder SetConfiguration(this KafkaMess configure(configuration); return builder.SetConfiguration(configuration.Build()); } - + /// /// Adds a Kafka publication by configuring it through a builder action. /// @@ -56,5 +56,5 @@ public static KafkaMessageProducerFactoryBuilder AddPublication( publication.SetRequestType(typeof(TRequest)); configure(publication); return builder.AddPublication(publication.Build()); - } + } } \ No newline at end of file diff --git a/src/Fluent.Brighter.Kafka/Extensions/KafkaMessagingGatewayConfigurationBuilderExtensions.cs b/src/Fluent.Brighter.Kafka/Extensions/KafkaMessagingGatewayConfigurationBuilderExtensions.cs index 8a2b6ff..48d9041 100644 --- a/src/Fluent.Brighter.Kafka/Extensions/KafkaMessagingGatewayConfigurationBuilderExtensions.cs +++ b/src/Fluent.Brighter.Kafka/Extensions/KafkaMessagingGatewayConfigurationBuilderExtensions.cs @@ -69,7 +69,7 @@ public static KafkaMessagingGatewayConfigurationBuilder UseOAuthBearerSaslMechan } #endregion - + #region SecurityProtocol /// diff --git a/src/Fluent.Brighter.Kafka/Extensions/KafkaSubscriptionBuilderExtensions.cs b/src/Fluent.Brighter.Kafka/Extensions/KafkaSubscriptionBuilderExtensions.cs index 37f3056..289acbb 100644 --- a/src/Fluent.Brighter.Kafka/Extensions/KafkaSubscriptionBuilderExtensions.cs +++ b/src/Fluent.Brighter.Kafka/Extensions/KafkaSubscriptionBuilderExtensions.cs @@ -35,7 +35,7 @@ public static KafkaSubscriptionBuilder UseReactorMode(this KafkaSubscriptionBuil } #endregion - + #region MakeChannels /// diff --git a/src/Fluent.Brighter.Kafka/KafkaConfigurator.cs b/src/Fluent.Brighter.Kafka/KafkaConfigurator.cs index 7c61a28..b52e4e8 100644 --- a/src/Fluent.Brighter.Kafka/KafkaConfigurator.cs +++ b/src/Fluent.Brighter.Kafka/KafkaConfigurator.cs @@ -37,7 +37,7 @@ public KafkaConfigurator SetConnection(KafkaMessagingGatewayConfiguration connec _connection = connection; return this; } - + /// /// Configures Kafka message publications (producers) for the Brighter pipeline. /// @@ -56,7 +56,7 @@ public KafkaConfigurator UsePublications(Action /// Configures Kafka message subscriptions (consumers) for the Brighter pipeline. /// @@ -73,7 +73,7 @@ public KafkaConfigurator UseSubscriptions(Action configure(configurator); sub.AddChannelFactory(channel); - + foreach (var subscription in configurator.Subscriptions) { sub.AddKafkaSubscription(subscription); @@ -82,7 +82,7 @@ public KafkaConfigurator UseSubscriptions(Action }; return this; } - + /// /// Applies the configured Kafka settings to the provided Brighter builder. /// @@ -94,7 +94,7 @@ internal void SetFluentBrighter(FluentBrighterBuilder fluentBrighter) { throw new ConfigurationException("No MessagingGatewayConnection was set"); } - + _action(fluentBrighter); } } \ No newline at end of file diff --git a/src/Fluent.Brighter.Kafka/KafkaMessageProducerFactoryBuilder.cs b/src/Fluent.Brighter.Kafka/KafkaMessageProducerFactoryBuilder.cs index ca820ba..a52fe6f 100644 --- a/src/Fluent.Brighter.Kafka/KafkaMessageProducerFactoryBuilder.cs +++ b/src/Fluent.Brighter.Kafka/KafkaMessageProducerFactoryBuilder.cs @@ -38,7 +38,7 @@ public KafkaMessageProducerFactoryBuilder SetPublications(params KafkaPublicatio _publications = publications.ToList(); return this; } - + /// /// Adds a single Kafka publication configuration to the factory. /// @@ -61,7 +61,7 @@ internal KafkaMessageProducerFactory Build() { throw new ConfigurationException("The configuration was not set"); } - + return new KafkaMessageProducerFactory(_configuration, _publications); } } \ No newline at end of file diff --git a/src/Fluent.Brighter.Kafka/KafkaMessagingGatewayConfigurationBuilder.cs b/src/Fluent.Brighter.Kafka/KafkaMessagingGatewayConfigurationBuilder.cs index 6bd39a7..75fc2ad 100644 --- a/src/Fluent.Brighter.Kafka/KafkaMessagingGatewayConfigurationBuilder.cs +++ b/src/Fluent.Brighter.Kafka/KafkaMessagingGatewayConfigurationBuilder.cs @@ -34,7 +34,7 @@ public KafkaMessagingGatewayConfigurationBuilder SetBootstrapServers(params stri } private string? _debug = null; - + /// /// Configures the debug contexts for the underlying Kafka client (e.g., "broker,topic"). /// @@ -86,7 +86,7 @@ public KafkaMessagingGatewayConfigurationBuilder SetSaslKerberosPrincipal(string } private string? _saslUsername; - + /// /// Sets the username for SASL authentication (e.g., for PLAIN or SCRAM mechanisms). /// @@ -99,7 +99,7 @@ public KafkaMessagingGatewayConfigurationBuilder SetSaslUsername(string saslUser } private string? _saslPassword; - + /// /// Sets the password for SASL authentication. /// @@ -112,7 +112,7 @@ public KafkaMessagingGatewayConfigurationBuilder SetSaslPassword(string saslPass } private SecurityProtocol? _securityProtocol = null; - + /// /// Configures the security protocol used to communicate with Kafka brokers. /// @@ -150,7 +150,7 @@ public KafkaMessagingGatewayConfigurationBuilder SetSslKeystoreLocation(string s return this; } - + private string? _sslKeystorePassword = null; /// diff --git a/src/Fluent.Brighter.Kafka/KafkaPublicationBuilder.cs b/src/Fluent.Brighter.Kafka/KafkaPublicationBuilder.cs index 1ba151d..d10def7 100644 --- a/src/Fluent.Brighter.Kafka/KafkaPublicationBuilder.cs +++ b/src/Fluent.Brighter.Kafka/KafkaPublicationBuilder.cs @@ -185,7 +185,7 @@ public KafkaPublicationBuilder SetIdempotence(bool enableIdempotence) _enableIdempotence = enableIdempotence; return this; } - + private int _lingerMs = 5; /// @@ -331,7 +331,7 @@ public KafkaPublicationBuilder SetRequestTimeoutMs(int requestTimeoutMs) } private int _topicFindTimeoutMs = 5000; - + /// /// Sets the timeout in milliseconds for operations that require topic metadata lookup (e.g., validation). /// diff --git a/src/Fluent.Brighter.Kafka/KafkaSubscriptionBuilder.cs b/src/Fluent.Brighter.Kafka/KafkaSubscriptionBuilder.cs index 110a221..f3bd47f 100644 --- a/src/Fluent.Brighter.Kafka/KafkaSubscriptionBuilder.cs +++ b/src/Fluent.Brighter.Kafka/KafkaSubscriptionBuilder.cs @@ -26,7 +26,7 @@ public KafkaSubscriptionBuilder SetSubscription(SubscriptionName subscriptionNam _subscriptionName = subscriptionName; return this; } - + private ChannelName? _channelName; private RoutingKey? _routingKey; @@ -42,7 +42,7 @@ public KafkaSubscriptionBuilder SetTopic(RoutingKey routingKey) _channelName = new ChannelName(routingKey.Value); return this; } - + private Type? _dataType; /// @@ -59,7 +59,7 @@ public KafkaSubscriptionBuilder SetDataType(Type? dataType) { return this; } - + if (_subscriptionName == null) { _subscriptionName = new SubscriptionName(dataType.ToString()); @@ -74,10 +74,10 @@ public KafkaSubscriptionBuilder SetDataType(Type? dataType) { _routingKey = new RoutingKey(dataType.Name); } - + return this; } - + private Func? _getRequestType; /// @@ -104,8 +104,8 @@ public KafkaSubscriptionBuilder SetBufferSize(int bufferSize) _bufferSize = bufferSize; return this; } - - private int _noOfPerformers = 1; + + private int _noOfPerformers = 1; /// /// Configures the number of parallel performers (handlers) processing messages from the channel. @@ -117,7 +117,7 @@ public KafkaSubscriptionBuilder SetNumberOfPerformers(int noOfPerformers) _noOfPerformers = noOfPerformers; return this; } - + private TimeSpan? _timeOut; /// @@ -130,7 +130,7 @@ public KafkaSubscriptionBuilder SetTimeout(TimeSpan? timeout) _timeOut = timeout; return this; } - + private int _requeueCount = -1; /// @@ -144,7 +144,7 @@ public KafkaSubscriptionBuilder SetRequeueCount(int requeueCount) _requeueCount = requeueCount; return this; } - + private TimeSpan? _requeueDelay; /// @@ -157,7 +157,7 @@ public KafkaSubscriptionBuilder SetRequeueDelay(TimeSpan? timeout) _requeueDelay = timeout; return this; } - + private int _unacceptableMessageLimit; /// @@ -168,10 +168,10 @@ public KafkaSubscriptionBuilder SetRequeueDelay(TimeSpan? timeout) /// The current builder instance for chaining. public KafkaSubscriptionBuilder SetUnacceptableMessageLimit(int unacceptableMessageLimit) { - _unacceptableMessageLimit = unacceptableMessageLimit ; + _unacceptableMessageLimit = unacceptableMessageLimit; return this; } - + private MessagePumpType _messagePumpType = MessagePumpType.Proactor; /// @@ -197,7 +197,7 @@ public KafkaSubscriptionBuilder SetChannelFactory(IAmAChannelFactory? channelFac _channelFactory = channelFactory; return this; } - + private OnMissingChannel _onMissingChannel = OnMissingChannel.Create; /// @@ -238,7 +238,7 @@ public KafkaSubscriptionBuilder SetChannelFailureDelay(TimeSpan? channelFailureD } private long _commitBatchSize = 10; - + /// /// Sets the number of messages processed before committing offsets to Kafka. /// @@ -262,9 +262,9 @@ public KafkaSubscriptionBuilder SetConfigHook(Action configHook) _configHook = configHook; return this; } - + private string? _groupId = null; - + /// /// Sets the Kafka consumer group ID. If not provided, Brighter may generate one. /// @@ -275,7 +275,7 @@ public KafkaSubscriptionBuilder SetConsumerGroupId(string groupId) _groupId = groupId; return this; } - + private IsolationLevel _isolationLevel = IsolationLevel.ReadCommitted; /// @@ -288,7 +288,7 @@ public KafkaSubscriptionBuilder SetIsolationLevel(IsolationLevel isolationLevel) _isolationLevel = isolationLevel; return this; } - + private TimeSpan _maxPollInterval = TimeSpan.FromMilliseconds(300000); /// @@ -301,7 +301,7 @@ public KafkaSubscriptionBuilder SetMaxPollInterval(TimeSpan maxPollInterval) _maxPollInterval = maxPollInterval; return this; } - + private int _numPartitions = 1; /// @@ -405,7 +405,7 @@ public KafkaSubscriptionBuilder SetTopicFindTimeout(TimeSpan topicFindTimeout) _topicFindTimeout = topicFindTimeout; return this; } - + /// /// Builds a new instance of with the configured settings. /// @@ -417,7 +417,7 @@ internal KafkaSubscription Build() { throw new ConfigurationException("SubscriptionName not set"); } - + if (_channelName == null) { throw new ConfigurationException("ChannelName not set"); @@ -427,7 +427,7 @@ internal KafkaSubscription Build() { throw new ConfigurationException("RoutingKey not set"); } - + return new KafkaSubscription( subscriptionName: _subscriptionName, channelName: _channelName, @@ -443,7 +443,7 @@ internal KafkaSubscription Build() messagePumpType: _messagePumpType, channelFactory: _channelFactory, makeChannels: _onMissingChannel, - emptyChannelDelay: _emptyChannelDelay, + emptyChannelDelay: _emptyChannelDelay, channelFailureDelay: _channelFailureDelay, commitBatchSize: _commitBatchSize, configHook: _configHook, @@ -461,4 +461,4 @@ internal KafkaSubscription Build() TopicFindTimeout = _topicFindTimeout }; } -} +} \ No newline at end of file diff --git a/src/Fluent.Brighter.Kafka/KafkaSubscriptionConfigurator.cs b/src/Fluent.Brighter.Kafka/KafkaSubscriptionConfigurator.cs index 0388651..f980b09 100644 --- a/src/Fluent.Brighter.Kafka/KafkaSubscriptionConfigurator.cs +++ b/src/Fluent.Brighter.Kafka/KafkaSubscriptionConfigurator.cs @@ -42,7 +42,7 @@ public KafkaSubscriptionConfigurator AddSubscription(Action /// Adds a Kafka subscription for a specific request type, enabling type-safe message handling. /// The request type is automatically registered, and additional configuration can be applied. diff --git a/src/Fluent.Brighter.MongoDb/Extensions/ConsumerBuilderExtensions.cs b/src/Fluent.Brighter.MongoDb/Extensions/ConsumerBuilderExtensions.cs index 6180440..cbd2d9f 100644 --- a/src/Fluent.Brighter.MongoDb/Extensions/ConsumerBuilderExtensions.cs +++ b/src/Fluent.Brighter.MongoDb/Extensions/ConsumerBuilderExtensions.cs @@ -27,7 +27,7 @@ public static ConsumerBuilder UseMongoDbInbox(this ConsumerBuilder builder, { throw new ArgumentNullException(nameof(configure)); } - + var configuration = new MongoDbConfigurationBuilder(); configure(configuration); return builder.UseMongoDbInbox(configuration.Build()); @@ -60,9 +60,9 @@ public static ConsumerBuilder UseMongoDbInbox(this ConsumerBuilder builder, Acti { throw new ArgumentNullException(nameof(configure)); } - + var inbox = new MongoDbInboxBuilder(); configure(inbox); return builder.SetInbox(cfg => cfg.SetInbox(inbox.Build())); } -} +} \ No newline at end of file diff --git a/src/Fluent.Brighter.MongoDb/Extensions/FluentBrighterExtensions.cs b/src/Fluent.Brighter.MongoDb/Extensions/FluentBrighterExtensions.cs index de2c638..3faecbd 100644 --- a/src/Fluent.Brighter.MongoDb/Extensions/FluentBrighterExtensions.cs +++ b/src/Fluent.Brighter.MongoDb/Extensions/FluentBrighterExtensions.cs @@ -31,7 +31,7 @@ public static FluentBrighterBuilder UsingMongoDb(this FluentBrighterBuilder buil { throw new ArgumentNullException(nameof(configure)); } - + var configurator = new MongoDbConfigurator(); configure(configurator); configurator.SetFluentBrighter(builder); diff --git a/src/Fluent.Brighter.MongoDb/Extensions/LuggageStoreBuilderExtensions.cs b/src/Fluent.Brighter.MongoDb/Extensions/LuggageStoreBuilderExtensions.cs index cbaecac..1a0fe3a 100644 --- a/src/Fluent.Brighter.MongoDb/Extensions/LuggageStoreBuilderExtensions.cs +++ b/src/Fluent.Brighter.MongoDb/Extensions/LuggageStoreBuilderExtensions.cs @@ -29,7 +29,7 @@ public static LuggageStoreBuilder UseMongoGridFsLuggageStore(this LuggageStoreBu { throw new ArgumentNullException(nameof(configure)); } - + var store = new MongoDbLuggageStoreBuilder(); configure(store); return builder.UseMongoGridFsLuggageStore(store.Build()); @@ -51,7 +51,7 @@ public static LuggageStoreBuilder UseMongoGridFsLuggageStore(this LuggageStoreBu { throw new ArgumentNullException(nameof(store)); } - + builder.UseLuggageStore(store); return builder; } diff --git a/src/Fluent.Brighter.MongoDb/Extensions/MongoDbConfigurationBuilderExtensions.cs b/src/Fluent.Brighter.MongoDb/Extensions/MongoDbConfigurationBuilderExtensions.cs index 2c443f5..b04eab5 100644 --- a/src/Fluent.Brighter.MongoDb/Extensions/MongoDbConfigurationBuilderExtensions.cs +++ b/src/Fluent.Brighter.MongoDb/Extensions/MongoDbConfigurationBuilderExtensions.cs @@ -27,7 +27,7 @@ public static MongoDbConfigurationBuilder SetOutbox(this MongoDbConfigurationBui { throw new ArgumentException("Collection name cannot be null or empty.", nameof(collectionName)); } - + return builder.SetOutbox(new MongoDbCollectionConfiguration { Name = collectionName }); } @@ -45,7 +45,7 @@ public static MongoDbConfigurationBuilder SetOutbox(this MongoDbConfigurationBui { throw new ArgumentNullException(nameof(configure)); } - + var collection = new MongoDbCollectionConfigurationBuilder(); configure(collection); return builder.SetOutbox(collection.Build()); @@ -68,7 +68,7 @@ public static MongoDbConfigurationBuilder SetInbox(this MongoDbConfigurationBuil { throw new ArgumentException("Collection name cannot be null or empty.", nameof(collectionName)); } - + return builder.SetInbox(new MongoDbCollectionConfiguration { Name = collectionName }); } @@ -86,7 +86,7 @@ public static MongoDbConfigurationBuilder SetInbox(this MongoDbConfigurationBuil { throw new ArgumentNullException(nameof(configure)); } - + var collection = new MongoDbCollectionConfigurationBuilder(); configure(collection); return builder.SetInbox(collection.Build()); @@ -109,7 +109,7 @@ public static MongoDbConfigurationBuilder SetLocking(this MongoDbConfigurationBu { throw new ArgumentException("Collection name cannot be null or empty.", nameof(collectionName)); } - + return builder.SetLocking(new MongoDbCollectionConfiguration { Name = collectionName }); } @@ -127,7 +127,7 @@ public static MongoDbConfigurationBuilder SetLocking(this MongoDbConfigurationBu { throw new ArgumentNullException(nameof(configure)); } - + var collection = new MongoDbCollectionConfigurationBuilder(); configure(collection); return builder.SetLocking(collection.Build()); diff --git a/src/Fluent.Brighter.MongoDb/Extensions/MongoDbInboxBuilderExtensions.cs b/src/Fluent.Brighter.MongoDb/Extensions/MongoDbInboxBuilderExtensions.cs index bc3f0e6..942b917 100644 --- a/src/Fluent.Brighter.MongoDb/Extensions/MongoDbInboxBuilderExtensions.cs +++ b/src/Fluent.Brighter.MongoDb/Extensions/MongoDbInboxBuilderExtensions.cs @@ -30,7 +30,7 @@ public static MongoDbInboxBuilder SetConfiguration(this MongoDbInboxBuilder buil { throw new ArgumentNullException(nameof(configure)); } - + var configuration = new MongoDbConfigurationBuilder(); configure(configuration); return builder.SetConfiguration(configuration.Build()); @@ -67,7 +67,7 @@ public static MongoDbInboxBuilder SetCollection(this MongoDbInboxBuilder builder { throw new ArgumentNullException(nameof(configure)); } - + var collection = new MongoDbCollectionConfigurationBuilder(); configure(collection); return builder.SetCollection(collection.Build()); diff --git a/src/Fluent.Brighter.MongoDb/Extensions/MongoDbLockingBuilderExtensions.cs b/src/Fluent.Brighter.MongoDb/Extensions/MongoDbLockingBuilderExtensions.cs index 5e46c86..4653b25 100644 --- a/src/Fluent.Brighter.MongoDb/Extensions/MongoDbLockingBuilderExtensions.cs +++ b/src/Fluent.Brighter.MongoDb/Extensions/MongoDbLockingBuilderExtensions.cs @@ -50,7 +50,7 @@ public static MongoDbLockingBuilder SetCollection(this MongoDbLockingBuilder bui { throw new ArgumentException("Collection name cannot be null or empty.", nameof(collectionName)); } - + return builder.SetCollection(new MongoDbCollectionConfiguration { Name = collectionName }); } @@ -71,7 +71,7 @@ public static MongoDbLockingBuilder SetCollection(this MongoDbLockingBuilder bui { throw new ArgumentNullException(nameof(configure)); } - + var collection = new MongoDbCollectionConfigurationBuilder(); configure(collection); return builder.SetCollection(collection.Build()); diff --git a/src/Fluent.Brighter.MongoDb/Extensions/MongoDbOutboxBuilderExtensions.cs b/src/Fluent.Brighter.MongoDb/Extensions/MongoDbOutboxBuilderExtensions.cs index 1e9f355..2647bde 100644 --- a/src/Fluent.Brighter.MongoDb/Extensions/MongoDbOutboxBuilderExtensions.cs +++ b/src/Fluent.Brighter.MongoDb/Extensions/MongoDbOutboxBuilderExtensions.cs @@ -29,7 +29,7 @@ public static MongoDbOutboxBuilder SetConfiguration(this MongoDbOutboxBuilder bu { throw new ArgumentNullException(nameof(configure)); } - + var configuration = new MongoDbConfigurationBuilder(); configure(configuration); return builder.SetConfiguration(configuration.Build()); @@ -50,7 +50,7 @@ public static MongoDbOutboxBuilder SetCollection(this MongoDbOutboxBuilder build { throw new ArgumentException("Collection name cannot be null or empty.", nameof(collectionName)); } - + return builder.SetCollection(new MongoDbCollectionConfiguration { Name = collectionName }); } @@ -71,7 +71,7 @@ public static MongoDbOutboxBuilder SetCollection(this MongoDbOutboxBuilder build { throw new ArgumentNullException(nameof(configure)); } - + var collection = new MongoDbCollectionConfigurationBuilder(); configure(collection); return builder.SetCollection(collection.Build()); diff --git a/src/Fluent.Brighter.MongoDb/Extensions/ProducersExtensions.cs b/src/Fluent.Brighter.MongoDb/Extensions/ProducersExtensions.cs index 3fbefd8..1b8dc93 100644 --- a/src/Fluent.Brighter.MongoDb/Extensions/ProducersExtensions.cs +++ b/src/Fluent.Brighter.MongoDb/Extensions/ProducersExtensions.cs @@ -30,7 +30,7 @@ public static ProducerBuilder UseMongoDbOutbox(this ProducerBuilder builder, Act { throw new ArgumentNullException(nameof(configure)); } - + var configuration = new MongoDbConfigurationBuilder(); configure(configuration); return builder.UseMongoDbOutbox(configuration.Build()); @@ -68,7 +68,7 @@ public static ProducerBuilder UseMongoDbOutbox(this ProducerBuilder builder, { throw new ArgumentNullException(nameof(configuration)); } - + var outbox = new MongoDbOutboxBuilder(); configuration(outbox); return builder.SetOutbox(outbox.Build()) @@ -96,7 +96,7 @@ public static ProducerBuilder UseMongoDbDistributedLock(this ProducerBuilder bui { throw new ArgumentNullException(nameof(configure)); } - + var configuration = new MongoDbConfigurationBuilder(); configure(configuration); return builder.UseMongoDbDistributedLock(configuration.Build()); @@ -134,7 +134,7 @@ public static ProducerBuilder UseMongoDbDistributedLock(this ProducerBuilder bui { throw new ArgumentNullException(nameof(configuration)); } - + var locking = new MongoDbLockingBuilder(); configuration(locking); builder.SetDistributedLock(locking.Build()); diff --git a/src/Fluent.Brighter.MongoDb/MongoDbConfigurationBuilder.cs b/src/Fluent.Brighter.MongoDb/MongoDbConfigurationBuilder.cs index d634222..5a93064 100644 --- a/src/Fluent.Brighter.MongoDb/MongoDbConfigurationBuilder.cs +++ b/src/Fluent.Brighter.MongoDb/MongoDbConfigurationBuilder.cs @@ -27,7 +27,7 @@ public MongoDbConfigurationBuilder SetClient(IMongoClient client) _client = client ?? throw new ArgumentNullException(nameof(client)); return this; } - + internal string? ConnectionString { get; private set; } /// @@ -42,7 +42,7 @@ public MongoDbConfigurationBuilder SetConnectionString(string connectionString) { throw new ArgumentException("Connection string cannot be null or empty.", nameof(connectionString)); } - + _client = new MongoClient(connectionString); ConnectionString = connectionString; return this; @@ -62,7 +62,7 @@ public MongoDbConfigurationBuilder SetDatabaseName(string databaseName) { throw new ArgumentException("Database name cannot be null or empty.", nameof(databaseName)); } - + _databaseName = databaseName; return this; } diff --git a/src/Fluent.Brighter.MongoDb/MongoDbConfigurator.cs b/src/Fluent.Brighter.MongoDb/MongoDbConfigurator.cs index b90a621..2c3fb64 100644 --- a/src/Fluent.Brighter.MongoDb/MongoDbConfigurator.cs +++ b/src/Fluent.Brighter.MongoDb/MongoDbConfigurator.cs @@ -32,7 +32,7 @@ public MongoDbConfigurator SetConnection(Action con { throw new ArgumentNullException(nameof(configuration)); } - + var builder = new MongoDbConfigurationBuilder(); configuration(builder); _connectionString = builder.ConnectionString; @@ -151,7 +151,7 @@ public MongoDbConfigurator UseOutbox(Action cfg .SetCollection(configure) .SetConfiguration(_configuration!))) - .RegisterServices(services => + .RegisterServices(services => services.AddSingleton(_configuration!)); }; return this; @@ -207,7 +207,7 @@ public MongoDbConfigurator UseDistributedLock(Action /// Configures a MongoDB GridFS luggage store using a custom bucket name. /// The database and connection are inherited from the shared MongoDB configuration. @@ -242,7 +242,7 @@ public MongoDbConfigurator UseLuggageStore(Action co var settings = _configuration!.Client.Settings; var builder = new MongoUrlBuilder { - AllowInsecureTls = settings.AllowInsecureTls, + AllowInsecureTls = settings.AllowInsecureTls, ApplicationName = settings.ApplicationName, AuthenticationMechanism = settings.Credential.Mechanism, AuthenticationSource = settings.Credential.Source, @@ -288,7 +288,7 @@ public MongoDbConfigurator UseLuggageStore(Action co }; cfg.SetConnectionString(builder.ToString()); } - + cfg.SetDatabaseName(_configuration!.DatabaseName); configure(cfg); })); diff --git a/src/Fluent.Brighter.MongoDb/MongoDbInboxBuilder.cs b/src/Fluent.Brighter.MongoDb/MongoDbInboxBuilder.cs index fa1b108..ae3aa7a 100644 --- a/src/Fluent.Brighter.MongoDb/MongoDbInboxBuilder.cs +++ b/src/Fluent.Brighter.MongoDb/MongoDbInboxBuilder.cs @@ -77,8 +77,8 @@ internal MongoDbInbox Build() } // Use connection provider if available; otherwise, rely on configuration's embedded client - return _connectionProvider == null - ? new MongoDbInbox(_configuration) + return _connectionProvider == null + ? new MongoDbInbox(_configuration) : new MongoDbInbox(_connectionProvider, _configuration); } } \ No newline at end of file diff --git a/src/Fluent.Brighter.MongoDb/MongoDbLuggageStoreBuilder.cs b/src/Fluent.Brighter.MongoDb/MongoDbLuggageStoreBuilder.cs index 1eb6490..939746a 100644 --- a/src/Fluent.Brighter.MongoDb/MongoDbLuggageStoreBuilder.cs +++ b/src/Fluent.Brighter.MongoDb/MongoDbLuggageStoreBuilder.cs @@ -10,7 +10,7 @@ namespace Fluent.Brighter.MongoDb; /// /// Provides a fluent builder for configuring . /// -public sealed class MongoDbLuggageStoreBuilder +public sealed class MongoDbLuggageStoreBuilder { private string _connectionString = string.Empty; @@ -24,7 +24,7 @@ public MongoDbLuggageStoreBuilder SetConnectionString(string connectionString) _connectionString = connectionString ?? throw new ArgumentNullException(nameof(connectionString)); return this; } - + private string _databaseName = string.Empty; /// @@ -37,7 +37,7 @@ public MongoDbLuggageStoreBuilder SetDatabaseName(string databaseName) _databaseName = databaseName ?? throw new ArgumentNullException(nameof(databaseName)); return this; } - + private string _bucketName = string.Empty; /// @@ -52,7 +52,7 @@ public MongoDbLuggageStoreBuilder SetBucketName(string bucketName) } private GridFSDownloadByNameOptions? _downloadOptions; - + /// /// Sets the download options for GridFS operations. /// @@ -63,7 +63,7 @@ public MongoDbLuggageStoreBuilder SetDownloadOptions(GridFSDownloadByNameOptions _downloadOptions = options; return this; } - + private GridFSUploadOptions? _uploadOptions; /// @@ -87,12 +87,12 @@ internal MongoDbLuggageStore Build() { throw new ConfigurationException("ConnectionString must be provided."); } - + if (string.IsNullOrEmpty(_databaseName)) { throw new ConfigurationException("DatabaseName must be provided."); } - + if (string.IsNullOrEmpty(_bucketName)) { throw new ConfigurationException("BucketName must be provided."); diff --git a/src/Fluent.Brighter.MySql/Extensions/MySqlInboxBuilderExtensions.cs b/src/Fluent.Brighter.MySql/Extensions/MySqlInboxBuilderExtensions.cs index d212f8c..dd5655b 100644 --- a/src/Fluent.Brighter.MySql/Extensions/MySqlInboxBuilderExtensions.cs +++ b/src/Fluent.Brighter.MySql/Extensions/MySqlInboxBuilderExtensions.cs @@ -18,7 +18,7 @@ public static class MySqlInboxBuilderExtensions /// The inbox builder instance to configure /// Action that defines the database configuration settings /// The original builder for fluent chaining - public static MySqlInboxBuilder SetConfiguration(this MySqlInboxBuilder builder, + public static MySqlInboxBuilder SetConfiguration(this MySqlInboxBuilder builder, Action configure) { var configuration = new RelationalDatabaseConfigurationBuilder(); diff --git a/src/Fluent.Brighter.MySql/Extensions/ProducersExtensions.cs b/src/Fluent.Brighter.MySql/Extensions/ProducersExtensions.cs index f325b0e..c4ae1ae 100644 --- a/src/Fluent.Brighter.MySql/Extensions/ProducersExtensions.cs +++ b/src/Fluent.Brighter.MySql/Extensions/ProducersExtensions.cs @@ -44,7 +44,7 @@ public static ProducerBuilder UseMySqlOutbox(this ProducerBuilder builder, { return builder.UseMySqlOutbox(cfg => cfg.SetConfiguration(configuration)); } - + /// /// Configures the MySQL outbox using a direct outbox builder delegate /// @@ -70,7 +70,7 @@ public static ProducerBuilder UseMySqlOutbox(this ProducerBuilder builder, builder.SetOutbox(outbox.Build()); return builder; } - + /// /// Configures a MySQL-based distributed lock using a database configuration /// @@ -83,7 +83,7 @@ public static ProducerBuilder UseMySqlOutbox(this ProducerBuilder builder, /// public static ProducerBuilder UseMySqlDistributedLock(this ProducerBuilder builder, IAmARelationalDatabaseConfiguration configuration) => builder.SetDistributedLock(new MySqlLockingProvider(new MySqlConnectionProvider(configuration))); - + /// /// Configures a MySQL-based distributed lock using a connection string /// @@ -96,6 +96,6 @@ public static ProducerBuilder UseMySqlDistributedLock(this ProducerBuilder build /// .UseMySqlDistributedLock("Server=localhost;Database=brighter;Uid=user;Pwd=pass;") /// /// - public static ProducerBuilder UseMySqlDistributedLock(this ProducerBuilder builder, string connectionString) + public static ProducerBuilder UseMySqlDistributedLock(this ProducerBuilder builder, string connectionString) => builder.UseMySqlDistributedLock(new RelationalDatabaseConfiguration(connectionString)); } \ No newline at end of file diff --git a/src/Fluent.Brighter.MySql/MySqlConfigurator.cs b/src/Fluent.Brighter.MySql/MySqlConfigurator.cs index c3b7106..eaa3cb8 100644 --- a/src/Fluent.Brighter.MySql/MySqlConfigurator.cs +++ b/src/Fluent.Brighter.MySql/MySqlConfigurator.cs @@ -31,7 +31,7 @@ public sealed class MySqlConfigurator { private RelationalDatabaseConfiguration? _configuration; private Action _action = _ => { }; - + /// /// Configures the MySQL connection using a fluent builder delegate /// @@ -39,7 +39,7 @@ public sealed class MySqlConfigurator /// This configurator for method chaining public MySqlConfigurator SetConnection(Action configuration) { - var builder = new RelationalDatabaseConfigurationBuilder(); + var builder = new RelationalDatabaseConfigurationBuilder(); configuration(builder); return SetConnection(builder.Build()); } @@ -95,7 +95,7 @@ public MySqlConfigurator UseOutbox() _action += fluent => fluent.Producers(x => x.UseMySqlOutbox(_configuration!)); return this; } - + /// /// Enables MySQL-based distributed locking /// @@ -121,7 +121,7 @@ internal void SetFluentBrighter(FluentBrighterBuilder fluentBrighter) { throw new ConfigurationException("No RelationalDatabaseConfiguration was set"); } - + _action(fluentBrighter); } } \ No newline at end of file diff --git a/src/Fluent.Brighter.MySql/MySqlInboxBuilder.cs b/src/Fluent.Brighter.MySql/MySqlInboxBuilder.cs index 90d029b..6bd01d4 100644 --- a/src/Fluent.Brighter.MySql/MySqlInboxBuilder.cs +++ b/src/Fluent.Brighter.MySql/MySqlInboxBuilder.cs @@ -48,14 +48,14 @@ public MySqlInboxBuilder SetConnectionProvider(IAmARelationalDbConnectionProvide _connectionProvider = connectionProvider; return this; } - + internal MySqlInbox Build() { if (_configuration == null) { throw new ConfigurationException("Configuration is null"); } - + return _connectionProvider == null ? new MySqlInbox(_configuration) : new MySqlInbox(_configuration, _connectionProvider); } } \ No newline at end of file diff --git a/src/Fluent.Brighter.MySql/MySqlOutboxBuilder.cs b/src/Fluent.Brighter.MySql/MySqlOutboxBuilder.cs index 2da9ac3..e9e13de 100644 --- a/src/Fluent.Brighter.MySql/MySqlOutboxBuilder.cs +++ b/src/Fluent.Brighter.MySql/MySqlOutboxBuilder.cs @@ -42,14 +42,14 @@ public MySqlOutboxBuilder SetConnectionProvider(IAmARelationalDbConnectionProvid _connectionProvider = connectionProvider; return this; } - + internal MySqlOutbox Build() { if (_configuration == null) { throw new ConfigurationException("Configuration is null"); } - + return _connectionProvider == null ? new MySqlOutbox(_configuration) : new MySqlOutbox(_configuration, _connectionProvider); } } \ No newline at end of file diff --git a/src/Fluent.Brighter.Postgres/Extensions/ConsumerBuilderExtensions.cs b/src/Fluent.Brighter.Postgres/Extensions/ConsumerBuilderExtensions.cs index 4decf4d..b94a562 100644 --- a/src/Fluent.Brighter.Postgres/Extensions/ConsumerBuilderExtensions.cs +++ b/src/Fluent.Brighter.Postgres/Extensions/ConsumerBuilderExtensions.cs @@ -19,9 +19,9 @@ public static class ConsumerBuilderExtensions /// The instance to configure. /// The pre-configured to add. /// The instance for method chaining. - public static ConsumerBuilder AddPostgresSubscription(this ConsumerBuilder builder, PostgresSubscription subscription) + public static ConsumerBuilder AddPostgresSubscription(this ConsumerBuilder builder, PostgresSubscription subscription) => builder.AddSubscription(subscription); - + /// /// Adds a PostgreSQL subscription to the consumer builder using a configuration action. /// This method creates a new , applies the configuration, and builds the subscription. @@ -36,7 +36,7 @@ public static ConsumerBuilder AddPostgresSubscription(this ConsumerBuilder build configure(sub); return builder.AddSubscription(sub.Build()); } - + /// /// Adds a PostgreSQL subscription for a specific request type to the consumer builder. /// This method automatically configures the subscription with the specified type @@ -55,7 +55,7 @@ public static ConsumerBuilder AddPostgresSubscription(this ConsumerBui configure(sub); return builder.AddSubscription(sub.Build()); } - + /// /// Configures the consumer to use a PostgreSQL inbox pattern using a database configuration builder. /// The inbox pattern ensures message deduplication and idempotent message processing by storing @@ -64,7 +64,7 @@ public static ConsumerBuilder AddPostgresSubscription(this ConsumerBui /// The instance to configure. /// An action that configures the with connection details. /// The instance for method chaining. - public static ConsumerBuilder UsePostgresInbox(this ConsumerBuilder builder, + public static ConsumerBuilder UsePostgresInbox(this ConsumerBuilder builder, Action configure) { var configuration = new RelationalDatabaseConfigurationBuilder(); @@ -120,7 +120,7 @@ public static ConsumerBuilder AddPostgresChannelFactory(this ConsumerBuilder bui /// The instance to configure. /// The pre-configured relational database configuration containing connection details. /// The instance for method chaining. - public static ConsumerBuilder AddPostgresChannelFactory(this ConsumerBuilder builder, RelationalDatabaseConfiguration configuration) + public static ConsumerBuilder AddPostgresChannelFactory(this ConsumerBuilder builder, RelationalDatabaseConfiguration configuration) { return builder .AddChannelFactory(new PostgresChannelFactory(new PostgresMessagingGatewayConnection(configuration))); diff --git a/src/Fluent.Brighter.Postgres/Extensions/PostgresMessageProducerFactoryBuilderExtensions.cs b/src/Fluent.Brighter.Postgres/Extensions/PostgresMessageProducerFactoryBuilderExtensions.cs index cd5fcad..aa82b7f 100644 --- a/src/Fluent.Brighter.Postgres/Extensions/PostgresMessageProducerFactoryBuilderExtensions.cs +++ b/src/Fluent.Brighter.Postgres/Extensions/PostgresMessageProducerFactoryBuilderExtensions.cs @@ -25,9 +25,9 @@ public static class PostgresMessageProducerFactoryBuilderExtensions /// The instance for method chaining. public static PostgresMessageProducerFactoryBuilder SetConnection( this PostgresMessageProducerFactoryBuilder builder, - RelationalDatabaseConfiguration configuration) + RelationalDatabaseConfiguration configuration) => builder.SetConnection(new PostgresMessagingGatewayConnection(configuration)); - + /// /// Sets the PostgreSQL messaging gateway connection using a fluent configuration builder. /// This extension method creates a , applies the provided configuration, @@ -45,7 +45,7 @@ public static PostgresMessageProducerFactoryBuilder SetConnection( return builder.SetConnection(new PostgresMessagingGatewayConnection(configuration.Build())); } #endregion - + #region AddPublication /// @@ -63,7 +63,7 @@ public static PostgresMessageProducerFactoryBuilder AddPublication( configure(publication); return builder.AddPublication(publication.Build()); } - + /// /// Adds a PostgreSQL publication for a specific request type to the producer factory. /// This method automatically configures the publication with the specified type @@ -76,7 +76,7 @@ public static PostgresMessageProducerFactoryBuilder AddPublication( public static PostgresMessageProducerFactoryBuilder AddPublication( this PostgresMessageProducerFactoryBuilder builder, Action configure) - where TRequest: class, IRequest + where TRequest : class, IRequest { var publication = new PostgresPublicationBuilder(); publication.SetRequestType(typeof(TRequest)); diff --git a/src/Fluent.Brighter.Postgres/Extensions/PostgresSubscriptionBuilderExtensions.cs b/src/Fluent.Brighter.Postgres/Extensions/PostgresSubscriptionBuilderExtensions.cs index 5b5297f..4257780 100644 --- a/src/Fluent.Brighter.Postgres/Extensions/PostgresSubscriptionBuilderExtensions.cs +++ b/src/Fluent.Brighter.Postgres/Extensions/PostgresSubscriptionBuilderExtensions.cs @@ -37,7 +37,7 @@ public static PostgresSubscriptionBuilder UseReactor(this PostgresSubscriptionBu } #endregion - + #region MakeChannels /// /// Configures the subscription to create PostgreSQL queues/topics if they don't exist. @@ -74,7 +74,7 @@ public static PostgresSubscriptionBuilder AssumeQueueExists(this PostgresSubscri } #endregion - + #region Binary Message Payload /// /// Enables binary message payload storage in PostgreSQL. @@ -101,7 +101,7 @@ public static PostgresSubscriptionBuilder DisableBinaryMessagePayload(this Postg } #endregion - + #region Table with large message /// /// Enables large message support for the PostgreSQL queue table. diff --git a/src/Fluent.Brighter.Postgres/Extensions/ProducersExtensions.cs b/src/Fluent.Brighter.Postgres/Extensions/ProducersExtensions.cs index 1cec1b3..195c013 100644 --- a/src/Fluent.Brighter.Postgres/Extensions/ProducersExtensions.cs +++ b/src/Fluent.Brighter.Postgres/Extensions/ProducersExtensions.cs @@ -59,7 +59,7 @@ public static ProducerBuilder UsePostgresOutbox(this ProducerBuilder builder, { return builder.UsePostgresOutbox(cfg => cfg.SetConfiguration(configuration)); } - + /// /// Configures the producer to use a PostgreSQL outbox pattern using a custom outbox builder configuration. /// This method provides the most flexibility by allowing direct configuration of the , diff --git a/src/Fluent.Brighter.Postgres/PostgresConfigurator.cs b/src/Fluent.Brighter.Postgres/PostgresConfigurator.cs index 7f0e249..fa72e54 100644 --- a/src/Fluent.Brighter.Postgres/PostgresConfigurator.cs +++ b/src/Fluent.Brighter.Postgres/PostgresConfigurator.cs @@ -14,7 +14,7 @@ public sealed class PostgresConfigurator { private PostgresMessagingGatewayConnection? _connection; private Action _action = _ => { }; - + /// /// Sets the PostgreSQL database connection using a fluent configuration builder. /// @@ -22,7 +22,7 @@ public sealed class PostgresConfigurator /// The current instance for method chaining. public PostgresConfigurator SetConnection(Action configuration) { - var builder = new RelationalDatabaseConfigurationBuilder(); + var builder = new RelationalDatabaseConfigurationBuilder(); configuration(builder); return SetConnection(builder.Build()); } @@ -112,7 +112,7 @@ public PostgresConfigurator UseSubscriptions(Action /// Builds and returns a configured instance. /// This method is called internally to create the inbox with the configured settings. @@ -49,7 +49,7 @@ internal PostgreSqlInbox Build() { throw new ConfigurationException("Configuration is null"); } - + return _connectionProvider == null ? new PostgreSqlInbox(_configuration) : new PostgreSqlInbox(_configuration, _connectionProvider); } } \ No newline at end of file diff --git a/src/Fluent.Brighter.Postgres/PostgresMessageProducerFactoryBuilder.cs b/src/Fluent.Brighter.Postgres/PostgresMessageProducerFactoryBuilder.cs index 341b003..4322473 100644 --- a/src/Fluent.Brighter.Postgres/PostgresMessageProducerFactoryBuilder.cs +++ b/src/Fluent.Brighter.Postgres/PostgresMessageProducerFactoryBuilder.cs @@ -23,9 +23,9 @@ public PostgresMessageProducerFactoryBuilder SetConnection(PostgresMessagingGate _connection = connection; return this; } - + private readonly List _publications = []; - + /// /// Adds a publication configuration that defines how messages are published to PostgreSQL. /// Publications define the mapping between message types and PostgreSQL topics/tables. @@ -50,7 +50,7 @@ internal PostgresMessageProducerFactory Build() { throw new ConfigurationException("No connection configured"); } - + return new PostgresMessageProducerFactory(_connection, _publications); } } \ No newline at end of file diff --git a/src/Fluent.Brighter.Postgres/PostgresOutboxBuilder.cs b/src/Fluent.Brighter.Postgres/PostgresOutboxBuilder.cs index 0caaa35..7fb5ca1 100644 --- a/src/Fluent.Brighter.Postgres/PostgresOutboxBuilder.cs +++ b/src/Fluent.Brighter.Postgres/PostgresOutboxBuilder.cs @@ -38,7 +38,7 @@ public PostgresOutboxBuilder SetConnectionProvider(IAmARelationalDbConnectionPro _connectionProvider = connectionProvider; return this; } - + private NpgsqlDataSource? _dataSource; /// @@ -52,7 +52,7 @@ public PostgresOutboxBuilder SetDataSource(NpgsqlDataSource dataSource) _dataSource = dataSource; return this; } - + /// /// Builds and returns a configured instance. /// This method is called internally to create the outbox with the configured settings. @@ -66,7 +66,7 @@ internal PostgreSqlOutbox Build() { throw new ConfigurationException("Configuration is null"); } - + return _connectionProvider == null ? new PostgreSqlOutbox(_configuration, _dataSource) : new PostgreSqlOutbox(_configuration, _connectionProvider); } } \ No newline at end of file diff --git a/src/Fluent.Brighter.Postgres/PostgresPublicationBuilder.cs b/src/Fluent.Brighter.Postgres/PostgresPublicationBuilder.cs index 3f2d096..3cb5297 100644 --- a/src/Fluent.Brighter.Postgres/PostgresPublicationBuilder.cs +++ b/src/Fluent.Brighter.Postgres/PostgresPublicationBuilder.cs @@ -27,7 +27,7 @@ public PostgresPublicationBuilder SetDataSchema(Uri? dataSchema) return this; } - private OnMissingChannel _makeChannels = OnMissingChannel.Create; + private OnMissingChannel _makeChannels = OnMissingChannel.Create; /// /// Sets the behavior for handling missing channels/topics in PostgreSQL. diff --git a/src/Fluent.Brighter.Postgres/PostgresSubscriptionBuilder.cs b/src/Fluent.Brighter.Postgres/PostgresSubscriptionBuilder.cs index 4b3f314..cdcaeb6 100644 --- a/src/Fluent.Brighter.Postgres/PostgresSubscriptionBuilder.cs +++ b/src/Fluent.Brighter.Postgres/PostgresSubscriptionBuilder.cs @@ -25,10 +25,10 @@ public PostgresSubscriptionBuilder SetSubscription(SubscriptionName subscription _subscriptionName = subscriptionName; return this; } - + private ChannelName? _channelName; private RoutingKey? _routingKey; - + /// /// Sets the channel name and routing key for the subscription. /// The channel represents the PostgreSQL queue/topic from which messages will be consumed. @@ -42,7 +42,7 @@ public PostgresSubscriptionBuilder SetQueue(ChannelName channelName) _routingKey = new RoutingKey(channelName.Value); return this; } - + private Type? _dataType; /// @@ -59,7 +59,7 @@ public PostgresSubscriptionBuilder SetDataType(Type? dataType) { return this; } - + if (_subscriptionName == null) { _subscriptionName = new SubscriptionName(dataType.ToString()); @@ -74,10 +74,10 @@ public PostgresSubscriptionBuilder SetDataType(Type? dataType) { _routingKey = new RoutingKey(dataType.Name); } - + return this; } - + private Func? _getRequestType; /// @@ -106,8 +106,8 @@ public PostgresSubscriptionBuilder SetBufferSize(int bufferSize) _bufferSize = bufferSize; return this; } - - private int _noOfPerformers = 1; + + private int _noOfPerformers = 1; /// /// Sets the number of performer threads that will process messages concurrently. @@ -120,9 +120,9 @@ public PostgresSubscriptionBuilder SetNumberOfPerformers(int noOfPerformers) _noOfPerformers = noOfPerformers; return this; } - + private TimeSpan? _timeOut; - + /// /// Sets the timeout duration for message processing operations. /// If a message handler takes longer than this timeout, the operation will be cancelled. @@ -134,9 +134,9 @@ public PostgresSubscriptionBuilder SetTimeout(TimeSpan? timeout) _timeOut = timeout; return this; } - + private int _requeueCount = -1; - + /// /// Sets the maximum number of times a failed message will be requeued for retry. /// Messages that fail processing can be retried up to this limit before being moved to a dead letter queue or discarded. @@ -148,9 +148,9 @@ public PostgresSubscriptionBuilder SetRequeueCount(int requeueCount) _requeueCount = requeueCount; return this; } - + private TimeSpan? _requeueDelay; - + /// /// Sets the delay before a failed message is requeued for retry. /// This provides a backoff period before attempting to process the message again, which can help with transient failures. @@ -162,9 +162,9 @@ public PostgresSubscriptionBuilder SetRequeueDelay(TimeSpan? timeout) _requeueDelay = timeout; return this; } - + private int _unacceptableMessageLimit; - + /// /// Sets the limit for the number of unacceptable messages that can be received before the channel stops processing. /// Unacceptable messages are those that cannot be deserialized or are malformed. This limit prevents endless processing of bad messages. @@ -173,12 +173,12 @@ public PostgresSubscriptionBuilder SetRequeueDelay(TimeSpan? timeout) /// The current instance for method chaining. public PostgresSubscriptionBuilder SetUnacceptableMessageLimit(int unacceptableMessageLimit) { - _unacceptableMessageLimit = unacceptableMessageLimit ; + _unacceptableMessageLimit = unacceptableMessageLimit; return this; } - + private MessagePumpType _messagePumpType = MessagePumpType.Proactor; - + /// /// Sets the message pump type that determines how messages are processed. /// Proactor uses async/await patterns for non-blocking I/O, while Reactor uses synchronous processing. @@ -204,7 +204,7 @@ public PostgresSubscriptionBuilder SetChannelFactory(IAmAChannelFactory? channel _channelFactory = channelFactory; return this; } - + private OnMissingChannel _onMissingChannel = OnMissingChannel.Create; /// @@ -317,7 +317,7 @@ public PostgresSubscriptionBuilder SetBinaryMessagePayload(bool? binaryMessagePa _binaryMessagePayload = binaryMessagePayload; return this; } - + /// /// Builds and returns a configured instance. /// This method is called internally to create the subscription with all the configured settings @@ -331,7 +331,7 @@ internal PostgresSubscription Build() { throw new ConfigurationException("SubscriptionName not set"); } - + if (_channelName == null) { throw new ConfigurationException("ChannelName not set"); @@ -341,7 +341,7 @@ internal PostgresSubscription Build() { throw new ConfigurationException("RoutingKey not set"); } - + return new PostgresSubscription( subscriptionName: _subscriptionName, channelName: _channelName, @@ -357,7 +357,7 @@ internal PostgresSubscription Build() messagePumpType: _messagePumpType, channelFactory: _channelFactory, makeChannels: _onMissingChannel, - emptyChannelDelay: _emptyChannelDelay, + emptyChannelDelay: _emptyChannelDelay, channelFailureDelay: _channelFailureDelay, schemaName: _schemaName, queueStoreTable: _queueStoreTable, diff --git a/src/Fluent.Brighter.Postgres/PostgresSubscriptionConfigurator.cs b/src/Fluent.Brighter.Postgres/PostgresSubscriptionConfigurator.cs index 4c77b46..57b0243 100644 --- a/src/Fluent.Brighter.Postgres/PostgresSubscriptionConfigurator.cs +++ b/src/Fluent.Brighter.Postgres/PostgresSubscriptionConfigurator.cs @@ -30,7 +30,7 @@ public PostgresSubscriptionConfigurator AddSubscription(PostgresSubscription sub Subscriptions.Add(subscription); return this; } - + /// /// Adds a PostgreSQL subscription using a builder configuration action. /// This method creates a new , applies the provided configuration, diff --git a/src/Fluent.Brighter.RMQ.Async/AmqpUriSpecificationBuilder.cs b/src/Fluent.Brighter.RMQ.Async/AmqpUriSpecificationBuilder.cs index e48e928..4aa997b 100644 --- a/src/Fluent.Brighter.RMQ.Async/AmqpUriSpecificationBuilder.cs +++ b/src/Fluent.Brighter.RMQ.Async/AmqpUriSpecificationBuilder.cs @@ -14,7 +14,7 @@ namespace Fluent.Brighter.RMQ.Async; public class AmqpUriSpecificationBuilder { private Uri? _uri; - + /// /// Sets the RabbitMQ connection URI /// @@ -27,7 +27,7 @@ public AmqpUriSpecificationBuilder SetUri(Uri uri) } private int _connectionRetryCount; - + /// /// Sets the maximum number of connection retry attempts /// @@ -40,7 +40,7 @@ public AmqpUriSpecificationBuilder SetConnectionRetryCount(int count) } private int _retryWaitInMilliseconds; - + /// /// Sets the delay between connection retry attempts /// @@ -51,9 +51,9 @@ public AmqpUriSpecificationBuilder SetRetryWaitInMilliseconds(int milliseconds) _retryWaitInMilliseconds = milliseconds; return this; } - + private int _circuitBreakTimeInMilliseconds; - + /// /// Sets the duration to break the circuit when connection failures exceed thresholds /// @@ -71,7 +71,7 @@ internal AmqpUriSpecification Build() { throw new ConfigurationException("Uri was not specified"); } - + return new AmqpUriSpecification( _uri, _connectionRetryCount, @@ -79,4 +79,4 @@ internal AmqpUriSpecification Build() _circuitBreakTimeInMilliseconds ); } -} +} \ No newline at end of file diff --git a/src/Fluent.Brighter.RMQ.Async/ExchangeBuilder.cs b/src/Fluent.Brighter.RMQ.Async/ExchangeBuilder.cs index 1524943..765d982 100644 --- a/src/Fluent.Brighter.RMQ.Async/ExchangeBuilder.cs +++ b/src/Fluent.Brighter.RMQ.Async/ExchangeBuilder.cs @@ -26,7 +26,7 @@ public ExchangeBuilder SetName(string name) _name = name; return this; } - + private string _type = ExchangeType.Direct; /// @@ -42,7 +42,7 @@ public ExchangeBuilder SetType(string type) return this; } private bool _durable; - + /// /// Configures exchange durability (default: non-durable) /// @@ -57,7 +57,7 @@ public ExchangeBuilder SetDurable(bool durable) } private bool _supportDelay; - + /// /// Enables delayed message support for the exchange /// @@ -77,7 +77,7 @@ internal Exchange Build() { throw new ConfigurationException("Exchange name cannot be null or empty."); } - + return new Exchange(_name!, _type, _durable, _supportDelay); } } \ No newline at end of file diff --git a/src/Fluent.Brighter.RMQ.Async/Extensions/AmqpUriSpecificationBuilderExtensions.cs b/src/Fluent.Brighter.RMQ.Async/Extensions/AmqpUriSpecificationBuilderExtensions.cs index b962c5f..eeccc76 100644 --- a/src/Fluent.Brighter.RMQ.Async/Extensions/AmqpUriSpecificationBuilderExtensions.cs +++ b/src/Fluent.Brighter.RMQ.Async/Extensions/AmqpUriSpecificationBuilderExtensions.cs @@ -24,7 +24,7 @@ public static class AmqpUriSpecificationBuilderExtensions /// builder.SetUri("amqp://user:pass@rabbitmq-server:5672/vhost") /// public static AmqpUriSpecificationBuilder SetUri( - this AmqpUriSpecificationBuilder builder, + this AmqpUriSpecificationBuilder builder, string uri) => builder.SetUri(new Uri(uri, UriKind.RelativeOrAbsolute)); } \ No newline at end of file diff --git a/src/Fluent.Brighter.RMQ.Async/Extensions/ConsumerBuilderExtensions.cs b/src/Fluent.Brighter.RMQ.Async/Extensions/ConsumerBuilderExtensions.cs index 1b0542f..ad78296 100644 --- a/src/Fluent.Brighter.RMQ.Async/Extensions/ConsumerBuilderExtensions.cs +++ b/src/Fluent.Brighter.RMQ.Async/Extensions/ConsumerBuilderExtensions.cs @@ -19,10 +19,10 @@ public static class ConsumerBuilderExtensions /// Pre-built subscription configuration /// Configured consumer builder public static ConsumerBuilder AddRabbitMqSubscription( - this ConsumerBuilder builder, + this ConsumerBuilder builder, RmqSubscription subscription) => builder.AddSubscription(subscription); - + /// /// Adds and configures a RabbitMQ subscription using a fluent builder /// @@ -37,14 +37,14 @@ public static ConsumerBuilder AddRabbitMqSubscription( /// ) /// public static ConsumerBuilder AddRabbitMqSubscription( - this ConsumerBuilder builder, + this ConsumerBuilder builder, Action configure) { var subBuilder = new RmqSubscriptionBuilder(); configure(subBuilder); return builder.AddSubscription(subBuilder.Build()); } - + /// /// Adds and configures a strongly-typed RabbitMQ subscription /// @@ -63,7 +63,7 @@ public static ConsumerBuilder AddRabbitMqSubscription( /// ) /// public static ConsumerBuilder AddRabbitMqSubscription( - this ConsumerBuilder builder, + this ConsumerBuilder builder, Action configure) where TRequest : class, IRequest { @@ -93,7 +93,7 @@ public static ConsumerBuilder AddRabbitMqChannelFactory( configure(connectionBuilder); return builder.AddRabbitMqChannelFactory(connectionBuilder.Build()); } - + /// /// Sets the RabbitMQ channel factory using a pre-configured connection /// @@ -101,7 +101,7 @@ public static ConsumerBuilder AddRabbitMqChannelFactory( /// Pre-built connection configuration /// Configured consumer builder public static ConsumerBuilder AddRabbitMqChannelFactory( - this ConsumerBuilder builder, + this ConsumerBuilder builder, RmqMessagingGatewayConnection connection) { return builder.AddChannelFactory(new ChannelFactory(new RmqMessageConsumerFactory(connection))); diff --git a/src/Fluent.Brighter.RMQ.Async/Extensions/ExchangeBuilderExtensions.cs b/src/Fluent.Brighter.RMQ.Async/Extensions/ExchangeBuilderExtensions.cs index 3ac75a1..cb12414 100644 --- a/src/Fluent.Brighter.RMQ.Async/Extensions/ExchangeBuilderExtensions.cs +++ b/src/Fluent.Brighter.RMQ.Async/Extensions/ExchangeBuilderExtensions.cs @@ -19,9 +19,9 @@ public static class ExchangeBuilderExtensions /// /// Exchange builder /// Configured exchange builder - public static ExchangeBuilder EnableDurable(this ExchangeBuilder builder) + public static ExchangeBuilder EnableDurable(this ExchangeBuilder builder) => builder.SetDurable(true); - + /// /// Configures the exchange as transient (deleted on broker restart) /// @@ -45,9 +45,9 @@ public static ExchangeBuilder DisableDurable(this ExchangeBuilder builder) /// /// Exchange builder /// Configured exchange builder - public static ExchangeBuilder EnableSupportDelay(this ExchangeBuilder builder) + public static ExchangeBuilder EnableSupportDelay(this ExchangeBuilder builder) => builder.SetSupportDelay(true); - + /// /// Disables delayed message support /// @@ -56,7 +56,7 @@ public static ExchangeBuilder EnableSupportDelay(this ExchangeBuilder builder) /// /// Exchange builder /// Configured exchange builder - public static ExchangeBuilder DisableSupportDelay(this ExchangeBuilder builder) + public static ExchangeBuilder DisableSupportDelay(this ExchangeBuilder builder) => builder.SetSupportDelay(false); #endregion @@ -72,7 +72,7 @@ public static ExchangeBuilder DisableSupportDelay(this ExchangeBuilder builder) /// Configured exchange builder public static ExchangeBuilder DirectType(this ExchangeBuilder builder) => builder.SetType(ExchangeType.Direct); - + /// /// Configures the exchange as Fanout type /// @@ -84,7 +84,7 @@ public static ExchangeBuilder DirectType(this ExchangeBuilder builder) /// Configured exchange builder public static ExchangeBuilder FanoutType(this ExchangeBuilder builder) => builder.SetType(ExchangeType.Fanout); - + /// /// Configures the exchange as Headers type /// @@ -96,7 +96,7 @@ public static ExchangeBuilder FanoutType(this ExchangeBuilder builder) /// Configured exchange builder public static ExchangeBuilder HeadersType(this ExchangeBuilder builder) => builder.SetType(ExchangeType.Headers); - + /// /// Configures the exchange as Topic type /// diff --git a/src/Fluent.Brighter.RMQ.Async/Extensions/RmqMessagingGatewayConnectionBuilderExtensions.cs b/src/Fluent.Brighter.RMQ.Async/Extensions/RmqMessagingGatewayConnectionBuilderExtensions.cs index b0032ab..9043f20 100644 --- a/src/Fluent.Brighter.RMQ.Async/Extensions/RmqMessagingGatewayConnectionBuilderExtensions.cs +++ b/src/Fluent.Brighter.RMQ.Async/Extensions/RmqMessagingGatewayConnectionBuilderExtensions.cs @@ -19,12 +19,12 @@ public static class RmqMessagingGatewayConnectionBuilderExtensions /// builder.SetAmpq("amqp://guest:guest@localhost:5672/") /// public static RmqMessagingGatewayConnectionBuilder SetAmpq( - this RmqMessagingGatewayConnectionBuilder builder, + this RmqMessagingGatewayConnectionBuilder builder, string uri) { return builder.SetAmpq(cfg => cfg.SetUri(uri)); } - + /// /// Configures the AMQP URI using a Uri object /// @@ -32,12 +32,12 @@ public static RmqMessagingGatewayConnectionBuilder SetAmpq( /// RabbitMQ connection URI /// Configured connection builder public static RmqMessagingGatewayConnectionBuilder SetAmpq( - this RmqMessagingGatewayConnectionBuilder builder, + this RmqMessagingGatewayConnectionBuilder builder, Uri uri) { return builder.SetAmpq(cfg => cfg.SetUri(uri)); } - + /// /// Configures advanced AMQP URI settings using a fluent builder /// @@ -59,7 +59,7 @@ public static RmqMessagingGatewayConnectionBuilder SetAmpq( configure(specification); return builder.SetAmpq(specification.Build()); } - + /// /// Configures the primary exchange using just the exchange name /// @@ -104,7 +104,7 @@ public static RmqMessagingGatewayConnectionBuilder SetExchange( configure(exchangeBuilder); return builder.SetExchange(exchangeBuilder.Build()); } - + /// /// Configures the dead letter exchange using a fluent builder /// diff --git a/src/Fluent.Brighter.RMQ.Async/Extensions/RmqPublicationBuilderExtensions.cs b/src/Fluent.Brighter.RMQ.Async/Extensions/RmqPublicationBuilderExtensions.cs index af1b66e..7314f1d 100644 --- a/src/Fluent.Brighter.RMQ.Async/Extensions/RmqPublicationBuilderExtensions.cs +++ b/src/Fluent.Brighter.RMQ.Async/Extensions/RmqPublicationBuilderExtensions.cs @@ -24,7 +24,7 @@ public static class RmqPublicationBuilderExtensions /// Configured publication builder public static RmqPublicationBuilder CreateTopicIfMissing(this RmqPublicationBuilder builder) => builder.SetMakeChannels(OnMissingChannel.Create); - + /// /// Configures the producer to validate exchange/topic existence before publishing /// @@ -36,7 +36,7 @@ public static RmqPublicationBuilder CreateTopicIfMissing(this RmqPublicationBuil /// Configured publication builder public static RmqPublicationBuilder ValidIfTopicExists(this RmqPublicationBuilder builder) => builder.SetMakeChannels(OnMissingChannel.Validate); - + /// /// Configures the producer to assume exchanges/topics exist /// diff --git a/src/Fluent.Brighter.RMQ.Async/Extensions/RmqSubscriptionBuilderExtensions.cs b/src/Fluent.Brighter.RMQ.Async/Extensions/RmqSubscriptionBuilderExtensions.cs index ea3f810..844cac0 100644 --- a/src/Fluent.Brighter.RMQ.Async/Extensions/RmqSubscriptionBuilderExtensions.cs +++ b/src/Fluent.Brighter.RMQ.Async/Extensions/RmqSubscriptionBuilderExtensions.cs @@ -26,7 +26,7 @@ public static class RmqSubscriptionBuilderExtensions /// Configured subscription builder public static RmqSubscriptionBuilder UseProactorMode(this RmqSubscriptionBuilder builder) => builder.SetMessagePumpType(MessagePumpType.Proactor); - + /// /// Configures the subscription to use Reactor message pump mode /// @@ -39,7 +39,7 @@ public static RmqSubscriptionBuilder UseProactorMode(this RmqSubscriptionBuilder public static RmqSubscriptionBuilder UseReactorMode(this RmqSubscriptionBuilder builder) => builder.SetMessagePumpType(MessagePumpType.Reactor); #endregion - + #region MakeChannels /// /// Configures the subscription to create required infrastructure (queues/exchanges) if missing @@ -51,7 +51,7 @@ public static RmqSubscriptionBuilder UseReactorMode(this RmqSubscriptionBuilder /// Configured subscription builder public static RmqSubscriptionBuilder CreateInfrastructureIfMissing(this RmqSubscriptionBuilder builder) => builder.SetMakeChannels(OnMissingChannel.Create); - + /// /// Configures the subscription to validate infrastructure existence on startup /// @@ -63,7 +63,7 @@ public static RmqSubscriptionBuilder CreateInfrastructureIfMissing(this RmqSubsc /// Configured subscription builder public static RmqSubscriptionBuilder ValidIfInfrastructureExists(this RmqSubscriptionBuilder builder) => builder.SetMakeChannels(OnMissingChannel.Validate); - + /// /// Configures the subscription to assume infrastructure exists /// @@ -76,7 +76,7 @@ public static RmqSubscriptionBuilder ValidIfInfrastructureExists(this RmqSubscri public static RmqSubscriptionBuilder AssumeInfrastructureExists(this RmqSubscriptionBuilder builder) => builder.SetMakeChannels(OnMissingChannel.Assume); #endregion - + #region QueueType /// /// Configures the queue as a Classic RabbitMQ queue @@ -88,7 +88,7 @@ public static RmqSubscriptionBuilder AssumeInfrastructureExists(this RmqSubscrip /// Configured subscription builder public static RmqSubscriptionBuilder UseClassicQueue(this RmqSubscriptionBuilder builder) => builder.SetQueueType(QueueType.Classic); - + /// /// Configures the queue as a Quorum queue /// @@ -113,7 +113,7 @@ public static RmqSubscriptionBuilder UseQuorumQueue(this RmqSubscriptionBuilder /// Configured subscription builder public static RmqSubscriptionBuilder EnableDurable(this RmqSubscriptionBuilder builder) => builder.SetIsDurable(true); - + /// /// Disables queue durability (transient queues) /// @@ -125,7 +125,7 @@ public static RmqSubscriptionBuilder EnableDurable(this RmqSubscriptionBuilder b public static RmqSubscriptionBuilder DisableDurable(this RmqSubscriptionBuilder builder) => builder.SetIsDurable(false); #endregion - + #region HighAvailability /// /// Enables queue mirroring across cluster nodes @@ -138,7 +138,7 @@ public static RmqSubscriptionBuilder DisableDurable(this RmqSubscriptionBuilder /// Configured subscription builder public static RmqSubscriptionBuilder EnableHighAvailability(this RmqSubscriptionBuilder builder) => builder.SethHighAvailability(true); - + /// /// Disables queue mirroring /// diff --git a/src/Fluent.Brighter.RMQ.Async/Extensions/RmqSubscriptionConfigurationExtensions.cs b/src/Fluent.Brighter.RMQ.Async/Extensions/RmqSubscriptionConfigurationExtensions.cs index d364fcb..d84ef9a 100644 --- a/src/Fluent.Brighter.RMQ.Async/Extensions/RmqSubscriptionConfigurationExtensions.cs +++ b/src/Fluent.Brighter.RMQ.Async/Extensions/RmqSubscriptionConfigurationExtensions.cs @@ -33,11 +33,11 @@ public static RmqMessageProducerFactoryBuilder SetConnection( this RmqMessageProducerFactoryBuilder builder, Action configure) { - var conn = new RmqMessagingGatewayConnectionBuilder(); + var conn = new RmqMessagingGatewayConnectionBuilder(); configure(conn); return builder.SetConnection(conn.Build()); } - + /// /// Adds a publication configuration using a fluent builder /// @@ -58,7 +58,7 @@ public static RmqMessageProducerFactoryBuilder AddPublication( configure(publicationBuilder); return builder.AddPublication(publicationBuilder.Build()); } - + /// /// Adds a strongly-typed publication configuration for a specific request type /// diff --git a/src/Fluent.Brighter.RMQ.Async/RabbitMqConfigurator.cs b/src/Fluent.Brighter.RMQ.Async/RabbitMqConfigurator.cs index 18e0039..56903a8 100644 --- a/src/Fluent.Brighter.RMQ.Async/RabbitMqConfigurator.cs +++ b/src/Fluent.Brighter.RMQ.Async/RabbitMqConfigurator.cs @@ -46,7 +46,7 @@ public RabbitMqConfigurator SetConnection(RmqMessagingGatewayConnection connecti _connection = connection; return this; } - + /// /// Configures message publications (producers) /// @@ -96,12 +96,12 @@ public RabbitMqConfigurator UseSubscriptions(Action { var channel = new ChannelFactory(new RmqMessageConsumerFactory(_connection!)); - + var configurator = new RabbitMqSubscriptionConfigurator(channel); configure(configurator); sub.AddChannelFactory(channel); - + foreach (var subscription in configurator.Subscriptions) { sub.AddRabbitMqSubscription(subscription); @@ -110,7 +110,7 @@ public RabbitMqConfigurator UseSubscriptions(Action /// Applies the configuration to Brighter's fluent builder (internal) /// @@ -123,7 +123,7 @@ internal void SetFluentBrighter(FluentBrighterBuilder fluentBrighter) { throw new ConfigurationException("RabbitMQ connection configuration is required. Use SetConnection() to configure connection settings."); } - + _action(fluentBrighter); } } \ No newline at end of file diff --git a/src/Fluent.Brighter.RMQ.Async/RabbitMqSubscriptionConfigurator.cs b/src/Fluent.Brighter.RMQ.Async/RabbitMqSubscriptionConfigurator.cs index 1b907dd..a45cf68 100644 --- a/src/Fluent.Brighter.RMQ.Async/RabbitMqSubscriptionConfigurator.cs +++ b/src/Fluent.Brighter.RMQ.Async/RabbitMqSubscriptionConfigurator.cs @@ -48,7 +48,7 @@ public RabbitMqSubscriptionConfigurator AddSubscription(Action /// Adds and configures a strongly-typed RabbitMQ subscription /// diff --git a/src/Fluent.Brighter.RMQ.Async/RmqMessageProducerFactoryBuilder.cs b/src/Fluent.Brighter.RMQ.Async/RmqMessageProducerFactoryBuilder.cs index de04dd9..0ae6c1c 100644 --- a/src/Fluent.Brighter.RMQ.Async/RmqMessageProducerFactoryBuilder.cs +++ b/src/Fluent.Brighter.RMQ.Async/RmqMessageProducerFactoryBuilder.cs @@ -28,7 +28,7 @@ public RmqMessageProducerFactoryBuilder SetConnection(RmqMessagingGatewayConnect _connection = connection; return this; } - + private List _publications = []; /// @@ -66,7 +66,7 @@ internal RmqMessageProducerFactory Build() { throw new ConfigurationException("RabbitMQ connection configuration is required. Use SetConnection() to provide gateway settings."); } - + return new RmqMessageProducerFactory(_connection, _publications); } } \ No newline at end of file diff --git a/src/Fluent.Brighter.RMQ.Async/RmqMessagingGatewayConnectionBuilder.cs b/src/Fluent.Brighter.RMQ.Async/RmqMessagingGatewayConnectionBuilder.cs index 32b4ccb..2754bef 100644 --- a/src/Fluent.Brighter.RMQ.Async/RmqMessagingGatewayConnectionBuilder.cs +++ b/src/Fluent.Brighter.RMQ.Async/RmqMessagingGatewayConnectionBuilder.cs @@ -23,7 +23,7 @@ public RmqMessagingGatewayConnectionBuilder SetName(string name) _connection.Name = name; return this; } - + /// /// Sets the AMQP URI specification for the RabbitMQ connection /// @@ -34,7 +34,7 @@ public RmqMessagingGatewayConnectionBuilder SetAmpq(AmqpUriSpecification ampqUri _connection.AmpqUri = ampqUri; return this; } - + /// /// Sets the primary exchange configuration /// @@ -45,7 +45,7 @@ public RmqMessagingGatewayConnectionBuilder SetExchange(Exchange exchange) _connection.Exchange = exchange; return this; } - + /// /// Sets the dead letter exchange for handling failed messages /// @@ -106,7 +106,7 @@ internal RmqMessagingGatewayConnection Build() { throw new ConfigurationException("AMQP URI configuration is required. Use SetAmpq() to configure connection parameters."); } - + if (_connection.Exchange == null) { throw new ConfigurationException("Primary exchange configuration is required. Use SetExchange() to define message publication settings."); diff --git a/src/Fluent.Brighter.RMQ.Async/RmqPublicationBuilder.cs b/src/Fluent.Brighter.RMQ.Async/RmqPublicationBuilder.cs index d6af9df..25d9da7 100644 --- a/src/Fluent.Brighter.RMQ.Async/RmqPublicationBuilder.cs +++ b/src/Fluent.Brighter.RMQ.Async/RmqPublicationBuilder.cs @@ -28,7 +28,7 @@ public RmqPublicationBuilder SetDataSchema(Uri? dataSchema) return this; } - private OnMissingChannel _makeChannels = OnMissingChannel.Create; + private OnMissingChannel _makeChannels = OnMissingChannel.Create; /// /// Configures channel creation behavior when missing (default: Create) @@ -167,7 +167,7 @@ public RmqPublicationBuilder SetWaitForConfirmsTimeOutInMilliseconds(int waitFor /// Fully configured publication settings internal RmqPublication Build() { - return new RmqPublication + return new RmqPublication { DataSchema = _dataSchema, MakeChannels = _makeChannels, diff --git a/src/Fluent.Brighter.RMQ.Async/RmqSubscriptionBuilder.cs b/src/Fluent.Brighter.RMQ.Async/RmqSubscriptionBuilder.cs index 4109455..33f23d8 100644 --- a/src/Fluent.Brighter.RMQ.Async/RmqSubscriptionBuilder.cs +++ b/src/Fluent.Brighter.RMQ.Async/RmqSubscriptionBuilder.cs @@ -27,9 +27,9 @@ public RmqSubscriptionBuilder SetSubscription(SubscriptionName subscriptionName) _subscriptionName = subscriptionName; return this; } - + private ChannelName? _channelName; - + /// /// Sets the queue name to consume from /// @@ -40,9 +40,9 @@ public RmqSubscriptionBuilder SetQueue(ChannelName channelName) _channelName = channelName; return this; } - + private RoutingKey? _routingKey; - + /// /// Sets the binding key for topic-based routing /// @@ -53,7 +53,7 @@ public RmqSubscriptionBuilder SetTopic(RoutingKey routingKey) _routingKey = routingKey; return this; } - + private Type? _dataType; /// @@ -71,18 +71,18 @@ public RmqSubscriptionBuilder SetDataType(Type? dataType) { _dataType = dataType; if (dataType == null) return this; - + _subscriptionName ??= new SubscriptionName(dataType.ToString()); - _channelName = ChannelName.IsNullOrEmpty(_channelName) - ? new ChannelName(dataType.Name) + _channelName = ChannelName.IsNullOrEmpty(_channelName) + ? new ChannelName(dataType.Name) : _channelName; - _routingKey = RoutingKey.IsNullOrEmpty(_routingKey) - ? new RoutingKey(dataType.Name) + _routingKey = RoutingKey.IsNullOrEmpty(_routingKey) + ? new RoutingKey(dataType.Name) : _routingKey; - + return this; } - + private Func? _getRequestType; /// @@ -108,8 +108,8 @@ public RmqSubscriptionBuilder SetBufferSize(int bufferSize) _bufferSize = bufferSize; return this; } - - private int _noOfPerformers = 1; + + private int _noOfPerformers = 1; /// /// Sets the number of concurrent consumers (default: 1) @@ -121,9 +121,9 @@ public RmqSubscriptionBuilder SetNumberOfPerformers(int noOfPerformers) _noOfPerformers = noOfPerformers; return this; } - + private TimeSpan? _timeOut; - + /// /// Sets the message processing timeout (optional) /// @@ -134,9 +134,9 @@ public RmqSubscriptionBuilder SetTimeout(TimeSpan? timeout) _timeOut = timeout; return this; } - + private int _requeueCount = -1; - + /// /// Sets maximum requeue attempts before discarding (default: -1 infinite) /// @@ -147,9 +147,9 @@ public RmqSubscriptionBuilder SetRequeueCount(int requeueCount) _requeueCount = requeueCount; return this; } - + private TimeSpan? _requeueDelay; - + /// /// Sets delay before requeueing failed messages (optional) /// @@ -160,9 +160,9 @@ public RmqSubscriptionBuilder SetRequeueDelay(TimeSpan? timeout) _requeueDelay = timeout; return this; } - + private int _unacceptableMessageLimit; - + /// /// Sets consecutive error threshold before circuit breaking (default: 0 disabled) /// @@ -173,9 +173,9 @@ public RmqSubscriptionBuilder SetUnacceptableMessageLimit(int unacceptableMessag _unacceptableMessageLimit = unacceptableMessageLimit; return this; } - + private MessagePumpType _messagePumpType = MessagePumpType.Proactor; - + /// /// Sets message processing model (default: Proactor) /// @@ -199,9 +199,9 @@ public RmqSubscriptionBuilder SetChannelFactory(IAmAChannelFactory? channelFacto _channelFactory = channelFactory; return this; } - + private OnMissingChannel _onMissingChannel = OnMissingChannel.Create; - + /// /// Sets behavior when queues/channels are missing (default: Create) /// @@ -214,7 +214,7 @@ public RmqSubscriptionBuilder SetMakeChannels(OnMissingChannel onMissingChannel) } private TimeSpan? _emptyChannelDelay; - + /// /// Sets polling delay when no messages available (optional) /// @@ -227,7 +227,7 @@ public RmqSubscriptionBuilder SetEmptyChannelDelay(TimeSpan? emptyChannelDelay) } private TimeSpan? _channelFailureDelay; - + /// /// Sets recovery delay after channel failures (optional) /// @@ -277,7 +277,7 @@ public RmqSubscriptionBuilder SetIsDurable(bool isDurable) _isDurable = isDurable; return this; } - + private bool _highAvailability; /// @@ -303,9 +303,9 @@ public RmqSubscriptionBuilder SetDeadLetterChannel(ChannelName? deadLetterChanne _deadLetterChannelName = deadLetterChannelName; return this; } - + private RoutingKey? _deadLetterRoutingKey; - + /// /// Sets dead letter routing key (optional) /// @@ -316,7 +316,7 @@ public RmqSubscriptionBuilder SetDeadLetterRoutingKey(RoutingKey? deadLetterRout _deadLetterRoutingKey = deadLetterRoutingKey; return this; } - + private TimeSpan? _ttl; /// @@ -329,7 +329,7 @@ public RmqSubscriptionBuilder SetTTL(TimeSpan? ttl) _ttl = ttl; return this; } - + /// /// Constructs the final RmqSubscription configuration /// @@ -343,7 +343,7 @@ internal RmqSubscription Build() { throw new ConfigurationException("Subscription name is required. Set it via SetSubscription() or SetDataType()."); } - + if (_channelName == null) { throw new ConfigurationException("Queue name (ChannelName) is required. Set it via SetQueue() or SetDataType()."); @@ -353,7 +353,7 @@ internal RmqSubscription Build() { throw new ConfigurationException("Routing key (Topic) is required. Set it via SetTopic() or SetDataType()."); } - + return new RmqSubscription( subscriptionName: _subscriptionName, channelName: _channelName, @@ -369,7 +369,7 @@ internal RmqSubscription Build() messagePumpType: _messagePumpType, channelFactory: _channelFactory, makeChannels: _onMissingChannel, - emptyChannelDelay: _emptyChannelDelay, + emptyChannelDelay: _emptyChannelDelay, channelFailureDelay: _channelFailureDelay, maxQueueLength: _maxQueueLenght, queueType: _queueType, diff --git a/src/Fluent.Brighter.RMQ.Sync/AmqpUriSpecificationBuilder.cs b/src/Fluent.Brighter.RMQ.Sync/AmqpUriSpecificationBuilder.cs index 213ebe3..f10fa2a 100644 --- a/src/Fluent.Brighter.RMQ.Sync/AmqpUriSpecificationBuilder.cs +++ b/src/Fluent.Brighter.RMQ.Sync/AmqpUriSpecificationBuilder.cs @@ -14,7 +14,7 @@ namespace Fluent.Brighter.RMQ.Sync; public class AmqpUriSpecificationBuilder { private Uri? _uri; - + /// /// Sets the RabbitMQ connection URI /// @@ -27,7 +27,7 @@ public AmqpUriSpecificationBuilder SetUri(Uri uri) } private int _connectionRetryCount; - + /// /// Sets the maximum number of connection retry attempts /// @@ -40,7 +40,7 @@ public AmqpUriSpecificationBuilder SetConnectionRetryCount(int count) } private int _retryWaitInMilliseconds; - + /// /// Sets the delay between connection retry attempts /// @@ -51,9 +51,9 @@ public AmqpUriSpecificationBuilder SetRetryWaitInMilliseconds(int milliseconds) _retryWaitInMilliseconds = milliseconds; return this; } - + private int _circuitBreakTimeInMilliseconds; - + /// /// Sets the duration to break the circuit when connection failures exceed thresholds /// @@ -71,7 +71,7 @@ internal AmqpUriSpecification Build() { throw new ConfigurationException("Uri was not specified"); } - + return new AmqpUriSpecification( _uri, _connectionRetryCount, @@ -79,4 +79,4 @@ internal AmqpUriSpecification Build() _circuitBreakTimeInMilliseconds ); } -} +} \ No newline at end of file diff --git a/src/Fluent.Brighter.RMQ.Sync/ExchangeBuilder.cs b/src/Fluent.Brighter.RMQ.Sync/ExchangeBuilder.cs index 920669f..ad33f55 100644 --- a/src/Fluent.Brighter.RMQ.Sync/ExchangeBuilder.cs +++ b/src/Fluent.Brighter.RMQ.Sync/ExchangeBuilder.cs @@ -26,7 +26,7 @@ public ExchangeBuilder SetName(string name) _name = name; return this; } - + private string _type = ExchangeType.Direct; /// @@ -42,7 +42,7 @@ public ExchangeBuilder SetType(string type) return this; } private bool _durable; - + /// /// Configures exchange durability (default: non-durable) /// @@ -57,7 +57,7 @@ public ExchangeBuilder SetDurable(bool durable) } private bool _supportDelay; - + /// /// Enables delayed message support for the exchange /// @@ -77,7 +77,7 @@ internal Exchange Build() { throw new ConfigurationException("Exchange name cannot be null or empty."); } - + return new Exchange(_name!, _type, _durable, _supportDelay); } } \ No newline at end of file diff --git a/src/Fluent.Brighter.RMQ.Sync/Extensions/AmqpUriSpecificationBuilderExtensions.cs b/src/Fluent.Brighter.RMQ.Sync/Extensions/AmqpUriSpecificationBuilderExtensions.cs index 58bb09b..acfc89b 100644 --- a/src/Fluent.Brighter.RMQ.Sync/Extensions/AmqpUriSpecificationBuilderExtensions.cs +++ b/src/Fluent.Brighter.RMQ.Sync/Extensions/AmqpUriSpecificationBuilderExtensions.cs @@ -24,7 +24,7 @@ public static class AmqpUriSpecificationBuilderExtensions /// builder.SetUri("amqp://user:pass@rabbitmq-server:5672/vhost") /// public static AmqpUriSpecificationBuilder SetUri( - this AmqpUriSpecificationBuilder builder, + this AmqpUriSpecificationBuilder builder, string uri) => builder.SetUri(new Uri(uri, UriKind.RelativeOrAbsolute)); } \ No newline at end of file diff --git a/src/Fluent.Brighter.RMQ.Sync/Extensions/ConsumerBuilderExtensions.cs b/src/Fluent.Brighter.RMQ.Sync/Extensions/ConsumerBuilderExtensions.cs index 6b0b39c..21f78a3 100644 --- a/src/Fluent.Brighter.RMQ.Sync/Extensions/ConsumerBuilderExtensions.cs +++ b/src/Fluent.Brighter.RMQ.Sync/Extensions/ConsumerBuilderExtensions.cs @@ -19,10 +19,10 @@ public static class ConsumerBuilderExtensions /// Pre-built subscription configuration /// Configured consumer builder public static ConsumerBuilder AddRabbitMqSubscription( - this ConsumerBuilder builder, + this ConsumerBuilder builder, RmqSubscription subscription) => builder.AddSubscription(subscription); - + /// /// Adds and configures a RabbitMQ subscription using a fluent builder /// @@ -37,14 +37,14 @@ public static ConsumerBuilder AddRabbitMqSubscription( /// ) /// public static ConsumerBuilder AddRabbitMqSubscription( - this ConsumerBuilder builder, + this ConsumerBuilder builder, Action configure) { var subBuilder = new RmqSubscriptionBuilder(); configure(subBuilder); return builder.AddSubscription(subBuilder.Build()); } - + /// /// Adds and configures a strongly-typed RabbitMQ subscription /// @@ -63,7 +63,7 @@ public static ConsumerBuilder AddRabbitMqSubscription( /// ) /// public static ConsumerBuilder AddRabbitMqSubscription( - this ConsumerBuilder builder, + this ConsumerBuilder builder, Action configure) where TRequest : class, IRequest { @@ -93,7 +93,7 @@ public static ConsumerBuilder AddRabbitMqChannelFactory( configure(connectionBuilder); return builder.AddRabbitMqChannelFactory(connectionBuilder.Build()); } - + /// /// Sets the RabbitMQ channel factory using a pre-configured connection /// @@ -101,7 +101,7 @@ public static ConsumerBuilder AddRabbitMqChannelFactory( /// Pre-built connection configuration /// Configured consumer builder public static ConsumerBuilder AddRabbitMqChannelFactory( - this ConsumerBuilder builder, + this ConsumerBuilder builder, RmqMessagingGatewayConnection connection) { return builder.AddChannelFactory(new ChannelFactory(new RmqMessageConsumerFactory(connection))); diff --git a/src/Fluent.Brighter.RMQ.Sync/Extensions/ExchangeBuilderExtensions.cs b/src/Fluent.Brighter.RMQ.Sync/Extensions/ExchangeBuilderExtensions.cs index e2bb4dd..a34f145 100644 --- a/src/Fluent.Brighter.RMQ.Sync/Extensions/ExchangeBuilderExtensions.cs +++ b/src/Fluent.Brighter.RMQ.Sync/Extensions/ExchangeBuilderExtensions.cs @@ -19,9 +19,9 @@ public static class ExchangeBuilderExtensions /// /// Exchange builder /// Configured exchange builder - public static ExchangeBuilder EnableDurable(this ExchangeBuilder builder) + public static ExchangeBuilder EnableDurable(this ExchangeBuilder builder) => builder.SetDurable(true); - + /// /// Configures the exchange as transient (deleted on broker restart) /// @@ -45,9 +45,9 @@ public static ExchangeBuilder DisableDurable(this ExchangeBuilder builder) /// /// Exchange builder /// Configured exchange builder - public static ExchangeBuilder EnableSupportDelay(this ExchangeBuilder builder) + public static ExchangeBuilder EnableSupportDelay(this ExchangeBuilder builder) => builder.SetSupportDelay(true); - + /// /// Disables delayed message support /// @@ -56,7 +56,7 @@ public static ExchangeBuilder EnableSupportDelay(this ExchangeBuilder builder) /// /// Exchange builder /// Configured exchange builder - public static ExchangeBuilder DisableSupportDelay(this ExchangeBuilder builder) + public static ExchangeBuilder DisableSupportDelay(this ExchangeBuilder builder) => builder.SetSupportDelay(false); #endregion @@ -72,7 +72,7 @@ public static ExchangeBuilder DisableSupportDelay(this ExchangeBuilder builder) /// Configured exchange builder public static ExchangeBuilder DirectType(this ExchangeBuilder builder) => builder.SetType(ExchangeType.Direct); - + /// /// Configures the exchange as Fanout type /// @@ -84,7 +84,7 @@ public static ExchangeBuilder DirectType(this ExchangeBuilder builder) /// Configured exchange builder public static ExchangeBuilder FanoutType(this ExchangeBuilder builder) => builder.SetType(ExchangeType.Fanout); - + /// /// Configures the exchange as Headers type /// @@ -96,7 +96,7 @@ public static ExchangeBuilder FanoutType(this ExchangeBuilder builder) /// Configured exchange builder public static ExchangeBuilder HeadersType(this ExchangeBuilder builder) => builder.SetType(ExchangeType.Headers); - + /// /// Configures the exchange as Topic type /// diff --git a/src/Fluent.Brighter.RMQ.Sync/Extensions/RmqMessagingGatewayConnectionBuilderExtensions.cs b/src/Fluent.Brighter.RMQ.Sync/Extensions/RmqMessagingGatewayConnectionBuilderExtensions.cs index b5be97f..b536ef8 100644 --- a/src/Fluent.Brighter.RMQ.Sync/Extensions/RmqMessagingGatewayConnectionBuilderExtensions.cs +++ b/src/Fluent.Brighter.RMQ.Sync/Extensions/RmqMessagingGatewayConnectionBuilderExtensions.cs @@ -19,12 +19,12 @@ public static class RmqMessagingGatewayConnectionBuilderExtensions /// builder.SetAmpq("amqp://guest:guest@localhost:5672/") /// public static RmqMessagingGatewayConnectionBuilder SetAmpq( - this RmqMessagingGatewayConnectionBuilder builder, + this RmqMessagingGatewayConnectionBuilder builder, string uri) { return builder.SetAmpq(cfg => cfg.SetUri(uri)); } - + /// /// Configures the AMQP URI using a Uri object /// @@ -32,12 +32,12 @@ public static RmqMessagingGatewayConnectionBuilder SetAmpq( /// RabbitMQ connection URI /// Configured connection builder public static RmqMessagingGatewayConnectionBuilder SetAmpq( - this RmqMessagingGatewayConnectionBuilder builder, + this RmqMessagingGatewayConnectionBuilder builder, Uri uri) { return builder.SetAmpq(cfg => cfg.SetUri(uri)); } - + /// /// Configures advanced AMQP URI settings using a fluent builder /// @@ -59,7 +59,7 @@ public static RmqMessagingGatewayConnectionBuilder SetAmpq( configure(specification); return builder.SetAmpq(specification.Build()); } - + /// /// Configures the primary exchange using just the exchange name /// @@ -104,7 +104,7 @@ public static RmqMessagingGatewayConnectionBuilder SetExchange( configure(exchangeBuilder); return builder.SetExchange(exchangeBuilder.Build()); } - + /// /// Configures the dead letter exchange using a fluent builder /// diff --git a/src/Fluent.Brighter.RMQ.Sync/Extensions/RmqPublicationBuilderExtensions.cs b/src/Fluent.Brighter.RMQ.Sync/Extensions/RmqPublicationBuilderExtensions.cs index f4325a1..f111f01 100644 --- a/src/Fluent.Brighter.RMQ.Sync/Extensions/RmqPublicationBuilderExtensions.cs +++ b/src/Fluent.Brighter.RMQ.Sync/Extensions/RmqPublicationBuilderExtensions.cs @@ -24,7 +24,7 @@ public static class RmqPublicationBuilderExtensions /// Configured publication builder public static RmqPublicationBuilder CreateTopicIfMissing(this RmqPublicationBuilder builder) => builder.SetMakeChannels(OnMissingChannel.Create); - + /// /// Configures the producer to validate exchange/topic existence before publishing /// @@ -36,7 +36,7 @@ public static RmqPublicationBuilder CreateTopicIfMissing(this RmqPublicationBuil /// Configured publication builder public static RmqPublicationBuilder ValidIfTopicExists(this RmqPublicationBuilder builder) => builder.SetMakeChannels(OnMissingChannel.Validate); - + /// /// Configures the producer to assume exchanges/topics exist /// diff --git a/src/Fluent.Brighter.RMQ.Sync/Extensions/RmqSubscriptionBuilderExtensions.cs b/src/Fluent.Brighter.RMQ.Sync/Extensions/RmqSubscriptionBuilderExtensions.cs index eac54e6..56f475d 100644 --- a/src/Fluent.Brighter.RMQ.Sync/Extensions/RmqSubscriptionBuilderExtensions.cs +++ b/src/Fluent.Brighter.RMQ.Sync/Extensions/RmqSubscriptionBuilderExtensions.cs @@ -25,7 +25,7 @@ public static class RmqSubscriptionBuilderExtensions /// Configured subscription builder public static RmqSubscriptionBuilder UseProactorMode(this RmqSubscriptionBuilder builder) => builder.SetMessagePumpType(MessagePumpType.Proactor); - + /// /// Configures the subscription to use Reactor message pump mode /// @@ -38,7 +38,7 @@ public static RmqSubscriptionBuilder UseProactorMode(this RmqSubscriptionBuilder public static RmqSubscriptionBuilder UseReactorMode(this RmqSubscriptionBuilder builder) => builder.SetMessagePumpType(MessagePumpType.Reactor); #endregion - + #region MakeChannels /// /// Configures the subscription to create required infrastructure (queues/exchanges) if missing @@ -50,7 +50,7 @@ public static RmqSubscriptionBuilder UseReactorMode(this RmqSubscriptionBuilder /// Configured subscription builder public static RmqSubscriptionBuilder CreateInfrastructureIfMissing(this RmqSubscriptionBuilder builder) => builder.SetMakeChannels(OnMissingChannel.Create); - + /// /// Configures the subscription to validate infrastructure existence on startup /// @@ -62,7 +62,7 @@ public static RmqSubscriptionBuilder CreateInfrastructureIfMissing(this RmqSubsc /// Configured subscription builder public static RmqSubscriptionBuilder ValidIfInfrastructureExists(this RmqSubscriptionBuilder builder) => builder.SetMakeChannels(OnMissingChannel.Validate); - + /// /// Configures the subscription to assume infrastructure exists /// @@ -75,7 +75,7 @@ public static RmqSubscriptionBuilder ValidIfInfrastructureExists(this RmqSubscri public static RmqSubscriptionBuilder AssumeInfrastructureExists(this RmqSubscriptionBuilder builder) => builder.SetMakeChannels(OnMissingChannel.Assume); #endregion - + #region Durable /// /// Enables queue durability (survives broker restarts) @@ -87,7 +87,7 @@ public static RmqSubscriptionBuilder AssumeInfrastructureExists(this RmqSubscrip /// Configured subscription builder public static RmqSubscriptionBuilder EnableDurable(this RmqSubscriptionBuilder builder) => builder.SetIsDurable(true); - + /// /// Disables queue durability (transient queues) /// @@ -99,7 +99,7 @@ public static RmqSubscriptionBuilder EnableDurable(this RmqSubscriptionBuilder b public static RmqSubscriptionBuilder DisableDurable(this RmqSubscriptionBuilder builder) => builder.SetIsDurable(false); #endregion - + #region HighAvailability /// /// Enables queue mirroring across cluster nodes @@ -112,7 +112,7 @@ public static RmqSubscriptionBuilder DisableDurable(this RmqSubscriptionBuilder /// Configured subscription builder public static RmqSubscriptionBuilder EnableHighAvailability(this RmqSubscriptionBuilder builder) => builder.SethHighAvailability(true); - + /// /// Disables queue mirroring /// diff --git a/src/Fluent.Brighter.RMQ.Sync/Extensions/RmqSubscriptionConfigurationExtensions.cs b/src/Fluent.Brighter.RMQ.Sync/Extensions/RmqSubscriptionConfigurationExtensions.cs index 14b306c..a455244 100644 --- a/src/Fluent.Brighter.RMQ.Sync/Extensions/RmqSubscriptionConfigurationExtensions.cs +++ b/src/Fluent.Brighter.RMQ.Sync/Extensions/RmqSubscriptionConfigurationExtensions.cs @@ -58,7 +58,7 @@ public static RmqMessageProducerFactoryBuilder AddPublication( configure(publicationBuilder); return builder.AddPublication(publicationBuilder.Build()); } - + /// /// Adds a strongly-typed publication configuration for a specific request type /// diff --git a/src/Fluent.Brighter.RMQ.Sync/RabbitMqConfigurator.cs b/src/Fluent.Brighter.RMQ.Sync/RabbitMqConfigurator.cs index d85a343..22526af 100644 --- a/src/Fluent.Brighter.RMQ.Sync/RabbitMqConfigurator.cs +++ b/src/Fluent.Brighter.RMQ.Sync/RabbitMqConfigurator.cs @@ -46,7 +46,7 @@ public RabbitMqConfigurator SetConnection(RmqMessagingGatewayConnection connecti _connection = connection; return this; } - + /// /// Configures message publications (producers) /// @@ -96,12 +96,12 @@ public RabbitMqConfigurator UseSubscriptions(Action { var channel = new ChannelFactory(new RmqMessageConsumerFactory(_connection!)); - + var configurator = new RabbitMqSubscriptionConfigurator(channel); configure(configurator); sub.AddChannelFactory(channel); - + foreach (var subscription in configurator.Subscriptions) { sub.AddRabbitMqSubscription(subscription); @@ -110,7 +110,7 @@ public RabbitMqConfigurator UseSubscriptions(Action /// Applies the configuration to Brighter's fluent builder (internal) /// @@ -123,7 +123,7 @@ internal void SetFluentBrighter(FluentBrighterBuilder fluentBrighter) { throw new ConfigurationException("RabbitMQ connection configuration is required. Use SetConnection() to configure connection settings."); } - + _action(fluentBrighter); } } \ No newline at end of file diff --git a/src/Fluent.Brighter.RMQ.Sync/RabbitMqSubscriptionConfigurator.cs b/src/Fluent.Brighter.RMQ.Sync/RabbitMqSubscriptionConfigurator.cs index 134f844..b218d0e 100644 --- a/src/Fluent.Brighter.RMQ.Sync/RabbitMqSubscriptionConfigurator.cs +++ b/src/Fluent.Brighter.RMQ.Sync/RabbitMqSubscriptionConfigurator.cs @@ -48,7 +48,7 @@ public RabbitMqSubscriptionConfigurator AddSubscription(Action /// Adds and configures a strongly-typed RabbitMQ subscription /// diff --git a/src/Fluent.Brighter.RMQ.Sync/RmqMessageProducerFactoryBuilder.cs b/src/Fluent.Brighter.RMQ.Sync/RmqMessageProducerFactoryBuilder.cs index aac05d4..37bf752 100644 --- a/src/Fluent.Brighter.RMQ.Sync/RmqMessageProducerFactoryBuilder.cs +++ b/src/Fluent.Brighter.RMQ.Sync/RmqMessageProducerFactoryBuilder.cs @@ -28,7 +28,7 @@ public RmqMessageProducerFactoryBuilder SetConnection(RmqMessagingGatewayConnect _connection = connection; return this; } - + private List _publications = []; /// @@ -66,7 +66,7 @@ internal RmqMessageProducerFactory Build() { throw new ConfigurationException("RabbitMQ connection configuration is required. Use SetConnection() to provide gateway settings."); } - + return new RmqMessageProducerFactory(_connection, _publications); } } \ No newline at end of file diff --git a/src/Fluent.Brighter.RMQ.Sync/RmqMessagingGatewayConnectionBuilder.cs b/src/Fluent.Brighter.RMQ.Sync/RmqMessagingGatewayConnectionBuilder.cs index 082ca3a..b8304cb 100644 --- a/src/Fluent.Brighter.RMQ.Sync/RmqMessagingGatewayConnectionBuilder.cs +++ b/src/Fluent.Brighter.RMQ.Sync/RmqMessagingGatewayConnectionBuilder.cs @@ -23,7 +23,7 @@ public RmqMessagingGatewayConnectionBuilder SetName(string name) _connection.Name = name; return this; } - + /// /// Sets the AMQP URI specification for the RabbitMQ connection /// @@ -34,7 +34,7 @@ public RmqMessagingGatewayConnectionBuilder SetAmpq(AmqpUriSpecification ampqUri _connection.AmpqUri = ampqUri; return this; } - + /// /// Sets the primary exchange configuration /// @@ -45,7 +45,7 @@ public RmqMessagingGatewayConnectionBuilder SetExchange(Exchange exchange) _connection.Exchange = exchange; return this; } - + /// /// Sets the dead letter exchange for handling failed messages /// @@ -106,7 +106,7 @@ internal RmqMessagingGatewayConnection Build() { throw new ConfigurationException("AMQP URI configuration is required. Use SetAmpq() to configure connection parameters."); } - + if (_connection.Exchange == null) { throw new ConfigurationException("Primary exchange configuration is required. Use SetExchange() to define message publication settings."); diff --git a/src/Fluent.Brighter.RMQ.Sync/RmqPublicationBuilder.cs b/src/Fluent.Brighter.RMQ.Sync/RmqPublicationBuilder.cs index 9a3d1c7..e7b6c1b 100644 --- a/src/Fluent.Brighter.RMQ.Sync/RmqPublicationBuilder.cs +++ b/src/Fluent.Brighter.RMQ.Sync/RmqPublicationBuilder.cs @@ -28,7 +28,7 @@ public RmqPublicationBuilder SetDataSchema(Uri? dataSchema) return this; } - private OnMissingChannel _makeChannels = OnMissingChannel.Create; + private OnMissingChannel _makeChannels = OnMissingChannel.Create; /// /// Configures channel creation behavior when missing (default: Create) @@ -167,7 +167,7 @@ public RmqPublicationBuilder SetWaitForConfirmsTimeOutInMilliseconds(int waitFor /// Fully configured publication settings internal RmqPublication Build() { - return new RmqPublication + return new RmqPublication { DataSchema = _dataSchema, MakeChannels = _makeChannels, diff --git a/src/Fluent.Brighter.RMQ.Sync/RmqSubscriptionBuilder.cs b/src/Fluent.Brighter.RMQ.Sync/RmqSubscriptionBuilder.cs index 8483403..94ab6ec 100644 --- a/src/Fluent.Brighter.RMQ.Sync/RmqSubscriptionBuilder.cs +++ b/src/Fluent.Brighter.RMQ.Sync/RmqSubscriptionBuilder.cs @@ -27,9 +27,9 @@ public RmqSubscriptionBuilder SetSubscription(SubscriptionName subscriptionName) _subscriptionName = subscriptionName; return this; } - + private ChannelName? _channelName; - + /// /// Sets the queue name to consume from /// @@ -40,9 +40,9 @@ public RmqSubscriptionBuilder SetQueue(ChannelName channelName) _channelName = channelName; return this; } - + private RoutingKey? _routingKey; - + /// /// Sets the binding key for topic-based routing /// @@ -53,7 +53,7 @@ public RmqSubscriptionBuilder SetTopic(RoutingKey routingKey) _routingKey = routingKey; return this; } - + private Type? _dataType; /// @@ -71,18 +71,18 @@ public RmqSubscriptionBuilder SetDataType(Type? dataType) { _dataType = dataType; if (dataType == null) return this; - + _subscriptionName ??= new SubscriptionName(dataType.ToString()); - _channelName = ChannelName.IsNullOrEmpty(_channelName) - ? new ChannelName(dataType.Name) + _channelName = ChannelName.IsNullOrEmpty(_channelName) + ? new ChannelName(dataType.Name) : _channelName; - _routingKey = RoutingKey.IsNullOrEmpty(_routingKey) - ? new RoutingKey(dataType.Name) + _routingKey = RoutingKey.IsNullOrEmpty(_routingKey) + ? new RoutingKey(dataType.Name) : _routingKey; - + return this; } - + private Func? _getRequestType; /// @@ -108,8 +108,8 @@ public RmqSubscriptionBuilder SetBufferSize(int bufferSize) _bufferSize = bufferSize; return this; } - - private int _noOfPerformers = 1; + + private int _noOfPerformers = 1; /// /// Sets the number of concurrent consumers (default: 1) @@ -121,9 +121,9 @@ public RmqSubscriptionBuilder SetNumberOfPerformers(int noOfPerformers) _noOfPerformers = noOfPerformers; return this; } - + private TimeSpan? _timeOut; - + /// /// Sets the message processing timeout (optional) /// @@ -134,9 +134,9 @@ public RmqSubscriptionBuilder SetTimeout(TimeSpan? timeout) _timeOut = timeout; return this; } - + private int _requeueCount = -1; - + /// /// Sets maximum requeue attempts before discarding (default: -1 infinite) /// @@ -147,9 +147,9 @@ public RmqSubscriptionBuilder SetRequeueCount(int requeueCount) _requeueCount = requeueCount; return this; } - + private TimeSpan? _requeueDelay; - + /// /// Sets delay before requeueing failed messages (optional) /// @@ -160,9 +160,9 @@ public RmqSubscriptionBuilder SetRequeueDelay(TimeSpan? timeout) _requeueDelay = timeout; return this; } - + private int _unacceptableMessageLimit; - + /// /// Sets consecutive error threshold before circuit breaking (default: 0 disabled) /// @@ -173,9 +173,9 @@ public RmqSubscriptionBuilder SetUnacceptableMessageLimit(int unacceptableMessag _unacceptableMessageLimit = unacceptableMessageLimit; return this; } - + private MessagePumpType _messagePumpType = MessagePumpType.Proactor; - + /// /// Sets message processing model (default: Proactor) /// @@ -199,9 +199,9 @@ public RmqSubscriptionBuilder SetChannelFactory(IAmAChannelFactory? channelFacto _channelFactory = channelFactory; return this; } - + private OnMissingChannel _onMissingChannel = OnMissingChannel.Create; - + /// /// Sets behavior when queues/channels are missing (default: Create) /// @@ -214,7 +214,7 @@ public RmqSubscriptionBuilder SetMakeChannels(OnMissingChannel onMissingChannel) } private TimeSpan? _emptyChannelDelay; - + /// /// Sets polling delay when no messages available (optional) /// @@ -227,7 +227,7 @@ public RmqSubscriptionBuilder SetEmptyChannelDelay(TimeSpan? emptyChannelDelay) } private TimeSpan? _channelFailureDelay; - + /// /// Sets recovery delay after channel failures (optional) /// @@ -264,7 +264,7 @@ public RmqSubscriptionBuilder SetIsDurable(bool isDurable) _isDurable = isDurable; return this; } - + private bool _highAvailability; /// @@ -290,9 +290,9 @@ public RmqSubscriptionBuilder SetDeadLetterChannel(ChannelName? deadLetterChanne _deadLetterChannelName = deadLetterChannelName; return this; } - + private RoutingKey? _deadLetterRoutingKey; - + /// /// Sets dead letter routing key (optional) /// @@ -303,7 +303,7 @@ public RmqSubscriptionBuilder SetDeadLetterRoutingKey(RoutingKey? deadLetterRout _deadLetterRoutingKey = deadLetterRoutingKey; return this; } - + private TimeSpan? _ttl; /// @@ -316,7 +316,7 @@ public RmqSubscriptionBuilder SetTTL(TimeSpan? ttl) _ttl = ttl; return this; } - + /// /// Constructs the final RmqSubscription configuration /// @@ -330,7 +330,7 @@ internal RmqSubscription Build() { throw new ConfigurationException("Subscription name is required. Set it via SetSubscription() or SetDataType()."); } - + if (_channelName == null) { throw new ConfigurationException("Queue name (ChannelName) is required. Set it via SetQueue() or SetDataType()."); @@ -340,7 +340,7 @@ internal RmqSubscription Build() { throw new ConfigurationException("Routing key (Topic) is required. Set it via SetTopic() or SetDataType()."); } - + return new RmqSubscription( subscriptionName: _subscriptionName, channelName: _channelName, @@ -356,7 +356,7 @@ internal RmqSubscription Build() messagePumpType: _messagePumpType, channelFactory: _channelFactory, makeChannels: _onMissingChannel, - emptyChannelDelay: _emptyChannelDelay, + emptyChannelDelay: _emptyChannelDelay, channelFailureDelay: _channelFailureDelay, maxQueueLength: _maxQueueLenght, isDurable: _isDurable, diff --git a/src/Fluent.Brighter.Redis/Extensions/ConsumerBuilderExtensions.cs b/src/Fluent.Brighter.Redis/Extensions/ConsumerBuilderExtensions.cs index 725e7a2..f5d5c9a 100644 --- a/src/Fluent.Brighter.Redis/Extensions/ConsumerBuilderExtensions.cs +++ b/src/Fluent.Brighter.Redis/Extensions/ConsumerBuilderExtensions.cs @@ -36,7 +36,7 @@ public static ConsumerBuilder AddRedisSubscription(this ConsumerBuilder builder, configure(sub); return builder.AddSubscription(sub.Build()); } - + /// /// Adds a Redis subscription for a specific request type to the consumer builder. /// This method automatically configures the subscription with the specified type @@ -46,7 +46,7 @@ public static ConsumerBuilder AddRedisSubscription(this ConsumerBuilder builder, /// The instance to configure. /// An action that configures the with additional settings. /// The instance for method chaining. - public static ConsumerBuilder AddRedisSubscription(this ConsumerBuilder builder, + public static ConsumerBuilder AddRedisSubscription(this ConsumerBuilder builder, Action configure) where TRequest : class, IRequest { @@ -70,7 +70,7 @@ public static ConsumerBuilder AdRedisChannelFactory(this ConsumerBuilder builder configure(connection); return builder.AddRedisChannelFactory(connection.Build()); } - + /// /// Adds a Redis channel factory to the consumer builder using a pre-configured Redis messaging gateway configuration. /// Channel factories are responsible for creating message channels that consume messages from Redis. diff --git a/src/Fluent.Brighter.Redis/Extensions/RedisMessageProducerFactoryBuilderExtensions.cs b/src/Fluent.Brighter.Redis/Extensions/RedisMessageProducerFactoryBuilderExtensions.cs index 6d2110c..cd54601 100644 --- a/src/Fluent.Brighter.Redis/Extensions/RedisMessageProducerFactoryBuilderExtensions.cs +++ b/src/Fluent.Brighter.Redis/Extensions/RedisMessageProducerFactoryBuilderExtensions.cs @@ -28,7 +28,7 @@ public static RedisMessageProducerFactoryBuilder SetConfiguration(this RedisMess configure(configuration); return builder.SetConfiguration(configuration.Build()); } - + /// /// Adds a Redis publication to the producer factory using a configuration builder. /// Publications define how messages are published to Redis, including topic mappings and message metadata. @@ -63,5 +63,5 @@ public static RedisMessageProducerFactoryBuilder AddPublication( publication.SetRequestType(typeof(TRequest)); configure(publication); return builder.AddPublication(publication.Build()); - } + } } \ No newline at end of file diff --git a/src/Fluent.Brighter.Redis/Extensions/RedisSubscriptionBuilderExtensions.cs b/src/Fluent.Brighter.Redis/Extensions/RedisSubscriptionBuilderExtensions.cs index 7fb2d63..9336f76 100644 --- a/src/Fluent.Brighter.Redis/Extensions/RedisSubscriptionBuilderExtensions.cs +++ b/src/Fluent.Brighter.Redis/Extensions/RedisSubscriptionBuilderExtensions.cs @@ -38,7 +38,7 @@ public static RedisSubscriptionBuilder UseReactorMode(this RedisSubscriptionBuil } #endregion - + #region MakeChannels /// diff --git a/src/Fluent.Brighter.Redis/RedisConfigurator.cs b/src/Fluent.Brighter.Redis/RedisConfigurator.cs index fa7e661..f3cfe47 100644 --- a/src/Fluent.Brighter.Redis/RedisConfigurator.cs +++ b/src/Fluent.Brighter.Redis/RedisConfigurator.cs @@ -39,7 +39,7 @@ public RedisConfigurator SetConnection(RedisMessagingGatewayConfiguration connec _connection = connection; return this; } - + /// /// Configures Redis-based message publications. /// This method allows you to define how messages are published through Redis messaging gateway, @@ -60,7 +60,7 @@ public RedisConfigurator UsePublications(Action /// Configures Redis-based message subscriptions. /// This method allows you to define how messages are consumed from Redis messaging gateway, @@ -79,7 +79,7 @@ public RedisConfigurator UseSubscriptions(Action configure(configurator); sub.AddChannelFactory(channel); - + foreach (var subscription in configurator.Subscriptions) { sub.AddRedisSubscription(subscription); @@ -88,7 +88,7 @@ public RedisConfigurator UseSubscriptions(Action }; return this; } - + /// /// Applies the configured Redis settings to the Fluent Brighter builder. /// This method is called internally to set up all the configured Redis features. @@ -101,7 +101,7 @@ internal void SetFluentBrighter(FluentBrighterBuilder fluentBrighter) { throw new ConfigurationException("No MessagingGatewayConnection was set"); } - + _action(fluentBrighter); } } \ No newline at end of file diff --git a/src/Fluent.Brighter.Redis/RedisMessageProducerFactoryBuilder.cs b/src/Fluent.Brighter.Redis/RedisMessageProducerFactoryBuilder.cs index d94b86b..7502157 100644 --- a/src/Fluent.Brighter.Redis/RedisMessageProducerFactoryBuilder.cs +++ b/src/Fluent.Brighter.Redis/RedisMessageProducerFactoryBuilder.cs @@ -24,9 +24,9 @@ public RedisMessageProducerFactoryBuilder SetConfiguration(RedisMessagingGateway _configuration = configuration; return this; } - + private List _publications = []; - + /// /// Sets the collection of Redis message publications that define how messages are published. /// Publications define the mapping between message types and Redis channels/topics. @@ -39,7 +39,7 @@ public RedisMessageProducerFactoryBuilder SetPublications(params RedisMessagePub _publications = publications.ToList(); return this; } - + /// /// Adds a single publication configuration to the existing collection. /// Publications define the mapping between message types and Redis channels/topics. @@ -51,7 +51,7 @@ public RedisMessageProducerFactoryBuilder AddPublication(RedisMessagePublication _publications.Add(publications); return this; } - + /// /// Builds and returns a configured instance. /// This method is called internally to create the factory with the configured settings. @@ -64,7 +64,7 @@ internal RedisMessageProducerFactory Build() { throw new ConfigurationException("The configuration was not set"); } - + return new RedisMessageProducerFactory(_configuration, _publications); } } \ No newline at end of file diff --git a/src/Fluent.Brighter.Redis/RedisMessagingGatewayConfigurationBuilder.cs b/src/Fluent.Brighter.Redis/RedisMessagingGatewayConfigurationBuilder.cs index 94eba01..2d102fb 100644 --- a/src/Fluent.Brighter.Redis/RedisMessagingGatewayConfigurationBuilder.cs +++ b/src/Fluent.Brighter.Redis/RedisMessagingGatewayConfigurationBuilder.cs @@ -12,7 +12,7 @@ namespace Fluent.Brighter.Redis; public sealed class RedisMessagingGatewayConfigurationBuilder { private int? _defaultConnectTimeout; - + /// /// Sets the default RedisClient socket connect timeout. /// @@ -23,9 +23,9 @@ public RedisMessagingGatewayConfigurationBuilder SetDefaultConnectTimeout(int? d _defaultConnectTimeout = defaultConnectTimeout; return this; } - + private int? _defaultSendTimeout; - + /// /// Sets the default RedisClient socket send timeout. /// @@ -36,9 +36,9 @@ public RedisMessagingGatewayConfigurationBuilder SetDefaultSendTimeout(int? defa _defaultSendTimeout = defaultSendTimeout; return this; } - + private int? _defaultReceiveTimeout; - + /// /// Sets the default RedisClient socket receive timeout. /// @@ -49,9 +49,9 @@ public RedisMessagingGatewayConfigurationBuilder SetDefaultReceiveTimeout(int? d _defaultReceiveTimeout = defaultReceiveTimeout; return this; } - + private int? _defaultIdleTimeOutSecs; - + /// /// Sets the default idle timeout before a subscription is considered stale. /// @@ -62,9 +62,9 @@ public RedisMessagingGatewayConfigurationBuilder SetDefaultIdleTimeOutSecs(int? _defaultIdleTimeOutSecs = defaultIdleTimeOutSecs; return this; } - + private int? _defaultRetryTimeout; - + /// /// Sets the default retry timeout for automatic retry of failed operations. /// @@ -75,9 +75,9 @@ public RedisMessagingGatewayConfigurationBuilder SetDefaultRetryTimeout(int? def _defaultRetryTimeout = defaultRetryTimeout; return this; } - + private int? _bufferPoolMaxSize; - + /// /// Sets the byte buffer size for operations to use a byte buffer pool. /// @@ -88,9 +88,9 @@ public RedisMessagingGatewayConfigurationBuilder SetBufferPoolMaxSize(int? buffe _bufferPoolMaxSize = bufferPoolMaxSize; return this; } - + private bool? _verifyMasterConnections; - + /// /// Sets whether connections to master hosts should be verified to ensure they're still master instances. /// @@ -101,9 +101,9 @@ public RedisMessagingGatewayConfigurationBuilder SetVerifyMasterConnections(bool _verifyMasterConnections = verifyMasterConnections; return this; } - + private int? _hostLookupTimeoutMs; - + /// /// Sets the connect timeout on clients used to find the next available host. /// @@ -114,9 +114,9 @@ public RedisMessagingGatewayConfigurationBuilder SetHostLookupTimeoutMs(int? hos _hostLookupTimeoutMs = hostLookupTimeoutMs; return this; } - + private int? _assumeServerVersion; - + /// /// Sets the assumed Redis server version to skip server version checks. /// Specify the minimum version number (e.g., 2.8.12 => 2812, 2.9.1 => 2910). @@ -128,9 +128,9 @@ public RedisMessagingGatewayConfigurationBuilder SetAssumeServerVersion(int? ass _assumeServerVersion = assumeServerVersion; return this; } - + private TimeSpan? _deactivatedClientsExpiry; - + /// /// Sets how long to hold deactivated clients before disposing their subscription. /// Use to dispose of deactivated clients immediately. @@ -142,9 +142,9 @@ public RedisMessagingGatewayConfigurationBuilder SetDeactivatedClientsExpiry(Tim _deactivatedClientsExpiry = deactivatedClientsExpiry; return this; } - + private bool? _disableVerboseLogging; - + /// /// Sets whether debug logging should log detailed Redis operations. /// @@ -155,9 +155,9 @@ public RedisMessagingGatewayConfigurationBuilder SetDisableVerboseLogging(bool? _disableVerboseLogging = disableVerboseLogging; return this; } - + private int? _backoffMultiplier; - + /// /// Sets the exponential backoff interval for retrying connections on socket failure. /// @@ -168,9 +168,9 @@ public RedisMessagingGatewayConfigurationBuilder SetBackoffMultiplier(int? backo _backoffMultiplier = backoffMultiplier; return this; } - + private int? _maxPoolSize; - + /// /// Sets the maximum size of the Redis connection pool. /// @@ -181,9 +181,9 @@ public RedisMessagingGatewayConfigurationBuilder SetMaxPoolSize(int? maxPoolSize _maxPoolSize = maxPoolSize; return this; } - + private TimeSpan? _messageTimeToLive; - + /// /// Sets how long message bodies persist in Redis before being reclaimed. /// Once reclaimed, attempts to retrieve the message will fail and the message will be rejected. @@ -195,9 +195,9 @@ public RedisMessagingGatewayConfigurationBuilder SetMessageTimeToLive(TimeSpan? _messageTimeToLive = messageTimeToLive; return this; } - + private string? _redisConnectionString; - + /// /// Sets the Redis connection string that defines how to connect to Redis. /// @@ -208,7 +208,7 @@ public RedisMessagingGatewayConfigurationBuilder SetRedisConnectionString(string _redisConnectionString = redisConnectionString; return this; } - + /// /// Builds and returns a configured instance. /// This method is called internally to create the configuration with all the configured settings. diff --git a/src/Fluent.Brighter.Redis/RedisPublicationBuilder.cs b/src/Fluent.Brighter.Redis/RedisPublicationBuilder.cs index f5cdfbe..61438ff 100644 --- a/src/Fluent.Brighter.Redis/RedisPublicationBuilder.cs +++ b/src/Fluent.Brighter.Redis/RedisPublicationBuilder.cs @@ -14,7 +14,7 @@ namespace Fluent.Brighter.Redis; public sealed class RedisPublicationBuilder { private Uri? _dataSchema; - + /// /// Sets the data schema URI for CloudEvents messages. /// This defines the schema that describes the structure of the message data. @@ -26,9 +26,9 @@ public RedisPublicationBuilder SetDataSchema(Uri? dataSchema) _dataSchema = dataSchema; return this; } - + private OnMissingChannel _makeChannels = OnMissingChannel.Create; - + /// /// Sets the behavior for handling missing channels/topics in Redis. /// Determines whether to create, validate, or assume the existence of channels. @@ -40,9 +40,9 @@ public RedisPublicationBuilder SetMakeChannels(OnMissingChannel makeChannels) _makeChannels = makeChannels; return this; } - + private Type? _requestType; - + /// /// Sets the request type for the publication. /// This defines the .NET type of the message/command/event that will be published. @@ -54,9 +54,9 @@ public RedisPublicationBuilder SetRequestType(Type? requestType) _requestType = requestType; return this; } - + private Uri _source = new(MessageHeader.DefaultSource); - + /// /// Sets the source URI for CloudEvents messages. /// This identifies the context in which an event happened and is part of the CloudEvents specification. @@ -68,9 +68,9 @@ public RedisPublicationBuilder SetSource(Uri source) _source = source; return this; } - + private string? _subject; - + /// /// Sets the subject for CloudEvents messages. /// This describes the subject of the event in the context of the event producer and is part of the CloudEvents specification. @@ -82,9 +82,9 @@ public RedisPublicationBuilder SetSubject(string? subject) _subject = subject; return this; } - + private RoutingKey? _topic; - + /// /// Sets the routing key (topic/channel name) where messages will be published in Redis. /// This determines the destination topic for outgoing messages. @@ -96,9 +96,9 @@ public RedisPublicationBuilder SetTopic(RoutingKey? topic) _topic = topic; return this; } - + private CloudEventsType _type = CloudEventsType.Empty; - + /// /// Sets the CloudEvents type for messages. /// This describes the type of event related to the originating occurrence and is part of the CloudEvents specification. @@ -110,9 +110,9 @@ public RedisPublicationBuilder SetType(CloudEventsType type) _type = type; return this; } - + private IDictionary? _defaultHeaders; - + /// /// Sets default headers to be included with every published message. /// These headers provide additional metadata that will be sent along with messages. @@ -124,9 +124,9 @@ public RedisPublicationBuilder SetDefaultHeaders(IDictionary? de _defaultHeaders = defaultHeaders; return this; } - + private IDictionary? _cloudEventsAdditionalProperties; - + /// /// Sets additional CloudEvents extension properties to be included with published messages. /// CloudEvents allows custom extension attributes beyond the standard specification to provide additional context. @@ -144,9 +144,9 @@ public RedisPublicationBuilder SetCloudEventsAdditionalProperties(IDictionary /// Sets the reply-to address for request-reply messaging patterns. /// This specifies where response messages should be sent when implementing request-reply communication. @@ -158,7 +158,7 @@ public RedisPublicationBuilder SetReplyTo(string? replyTo) _replyTo = replyTo; return this; } - + /// /// Builds and returns a configured instance. /// This method is called internally to create the publication with all the configured settings diff --git a/src/Fluent.Brighter.Redis/RedisSubscriptionBuilder.cs b/src/Fluent.Brighter.Redis/RedisSubscriptionBuilder.cs index d6dbc80..02baaff 100644 --- a/src/Fluent.Brighter.Redis/RedisSubscriptionBuilder.cs +++ b/src/Fluent.Brighter.Redis/RedisSubscriptionBuilder.cs @@ -1,4 +1,5 @@ using System; + using Paramore.Brighter; using Paramore.Brighter.MessagingGateway.Redis; @@ -289,4 +290,4 @@ internal RedisSubscription Build() channelFailureDelay: _channelFailureDelay ); } -} +} \ No newline at end of file diff --git a/src/Fluent.Brighter.Redis/RedisSubscriptionConfigurator.cs b/src/Fluent.Brighter.Redis/RedisSubscriptionConfigurator.cs index c4d5f20..7795153 100644 --- a/src/Fluent.Brighter.Redis/RedisSubscriptionConfigurator.cs +++ b/src/Fluent.Brighter.Redis/RedisSubscriptionConfigurator.cs @@ -19,7 +19,7 @@ public sealed class RedisSubscriptionConfigurator(ChannelFactory channelFactory) /// This property is used internally to collect all subscriptions that have been added to the configurator. /// internal List Subscriptions { get; } = []; - + /// /// Adds a pre-configured Redis subscription to the configurator. /// @@ -30,7 +30,7 @@ public RedisSubscriptionConfigurator AddSubscription(RedisSubscription subscript Subscriptions.Add(subscription); return this; } - + /// /// Adds a Redis subscription using a builder configuration action. /// This method creates a new , applies the provided configuration, @@ -45,7 +45,7 @@ public RedisSubscriptionConfigurator AddSubscription(Action /// Adds a Redis subscription for a specific request type using a builder configuration action. /// This method automatically configures the subscription with the specified type diff --git a/src/Fluent.Brighter.RocketMQ/Extensions/ConsumerBuilderExtensions.cs b/src/Fluent.Brighter.RocketMQ/Extensions/ConsumerBuilderExtensions.cs index 21f1d46..b075360 100644 --- a/src/Fluent.Brighter.RocketMQ/Extensions/ConsumerBuilderExtensions.cs +++ b/src/Fluent.Brighter.RocketMQ/Extensions/ConsumerBuilderExtensions.cs @@ -19,10 +19,10 @@ public static class ConsumerBuilderExtensions /// Pre-built subscription configuration /// Configured consumer builder public static ConsumerBuilder AddRocketMqSubscription( - this ConsumerBuilder builder, + this ConsumerBuilder builder, RocketSubscription subscription) => builder.AddSubscription(subscription); - + /// /// Adds and configures a RocketMQ subscription using a fluent builder /// @@ -37,14 +37,14 @@ public static ConsumerBuilder AddRocketMqSubscription( /// ) /// public static ConsumerBuilder AddRocketMqSubscription( - this ConsumerBuilder builder, + this ConsumerBuilder builder, Action configure) { var subBuilder = new RocketSubscriptionBuilder(); configure(subBuilder); return builder.AddSubscription(subBuilder.Build()); } - + /// /// Adds and configures a strongly-typed RocketMQ subscription /// @@ -63,7 +63,7 @@ public static ConsumerBuilder AddRocketMqSubscription( /// ) /// public static ConsumerBuilder AddRocketMqSubscription( - this ConsumerBuilder builder, + this ConsumerBuilder builder, Action configure) where TRequest : class, IRequest { @@ -92,7 +92,7 @@ public static ConsumerBuilder AddRocketMqChannelFactory( configure(connectionBuilder); return builder.AddRocketMqChannelFactory(connectionBuilder.Build()); } - + /// /// Sets the RocketMQ channel factory using a pre-configured connection /// @@ -100,7 +100,7 @@ public static ConsumerBuilder AddRocketMqChannelFactory( /// Pre-built connection configuration /// Configured consumer builder public static ConsumerBuilder AddRocketMqChannelFactory( - this ConsumerBuilder builder, + this ConsumerBuilder builder, RocketMessagingGatewayConnection connection) { return builder.AddChannelFactory(new RocketMqChannelFactory(new RocketMessageConsumerFactory(connection))); diff --git a/src/Fluent.Brighter.RocketMQ/Extensions/RocketMessagingGatewayConnectionBuilderExtensions.cs b/src/Fluent.Brighter.RocketMQ/Extensions/RocketMessagingGatewayConnectionBuilderExtensions.cs index a38e365..eae7286 100644 --- a/src/Fluent.Brighter.RocketMQ/Extensions/RocketMessagingGatewayConnectionBuilderExtensions.cs +++ b/src/Fluent.Brighter.RocketMQ/Extensions/RocketMessagingGatewayConnectionBuilderExtensions.cs @@ -26,7 +26,7 @@ public static RocketMessagingGatewayConnectionBuilder SetClient( connectionBuilder.SetClient(builder.Build()); return connectionBuilder; } - + /// /// Configures the RocketMQ client with a simple endpoint string. /// Convenience method for basic endpoint configuration. diff --git a/src/Fluent.Brighter.RocketMQ/Extensions/RocketMqPublicationBuilderExtensions.cs b/src/Fluent.Brighter.RocketMQ/Extensions/RocketMqPublicationBuilderExtensions.cs index ef348fa..a099eac 100644 --- a/src/Fluent.Brighter.RocketMQ/Extensions/RocketMqPublicationBuilderExtensions.cs +++ b/src/Fluent.Brighter.RocketMQ/Extensions/RocketMqPublicationBuilderExtensions.cs @@ -24,7 +24,7 @@ public static class RocketMqPublicationBuilderExtensions /// Configured publication builder public static RocketMqPublicationBuilder ValidIfTopicExists(this RocketMqPublicationBuilder builder) => builder.SetMakeChannels(OnMissingChannel.Validate); - + /// /// Configures the producer to assume exchanges/topics exist /// diff --git a/src/Fluent.Brighter.RocketMQ/Extensions/RocketSubscriptionBuilderExtensions.cs b/src/Fluent.Brighter.RocketMQ/Extensions/RocketSubscriptionBuilderExtensions.cs index 34896a9..ae8a9ee 100644 --- a/src/Fluent.Brighter.RocketMQ/Extensions/RocketSubscriptionBuilderExtensions.cs +++ b/src/Fluent.Brighter.RocketMQ/Extensions/RocketSubscriptionBuilderExtensions.cs @@ -24,7 +24,7 @@ public static class RocketSubscriptionBuilderExtensions /// Configured subscription builder public static RocketSubscriptionBuilder UseProactorMode(this RocketSubscriptionBuilder builder) => builder.SetMessagePumpType(MessagePumpType.Proactor); - + /// /// Configures the subscription to use Reactor message pump mode /// @@ -37,7 +37,7 @@ public static RocketSubscriptionBuilder UseProactorMode(this RocketSubscriptionB public static RocketSubscriptionBuilder UseReactorMode(this RocketSubscriptionBuilder builder) => builder.SetMessagePumpType(MessagePumpType.Reactor); #endregion - + #region MakeChannels /// /// Configures the subscription to create required infrastructure (queues/exchanges) if missing @@ -49,7 +49,7 @@ public static RocketSubscriptionBuilder UseReactorMode(this RocketSubscriptionBu /// Configured subscription builder public static RocketSubscriptionBuilder CreateInfrastructureIfMissing(this RocketSubscriptionBuilder builder) => builder.SetMakeChannels(OnMissingChannel.Create); - + /// /// Configures the subscription to validate infrastructure existence on startup /// @@ -61,7 +61,7 @@ public static RocketSubscriptionBuilder CreateInfrastructureIfMissing(this Rocke /// Configured subscription builder public static RocketSubscriptionBuilder ValidIfInfrastructureExists(this RocketSubscriptionBuilder builder) => builder.SetMakeChannels(OnMissingChannel.Validate); - + /// /// Configures the subscription to assume infrastructure exists /// diff --git a/src/Fluent.Brighter.RocketMQ/Extensions/RocketSubscriptionConfigurationExtensions.cs b/src/Fluent.Brighter.RocketMQ/Extensions/RocketSubscriptionConfigurationExtensions.cs index ceb5b0f..9b37bc8 100644 --- a/src/Fluent.Brighter.RocketMQ/Extensions/RocketSubscriptionConfigurationExtensions.cs +++ b/src/Fluent.Brighter.RocketMQ/Extensions/RocketSubscriptionConfigurationExtensions.cs @@ -29,7 +29,7 @@ public static class RocketSubscriptionConfigurationExtensions /// .SetTopic("order.created")); /// public static RocketMessageProducerFactoryBuilder SetConnection( - this RocketMessageProducerFactoryBuilder builder, + this RocketMessageProducerFactoryBuilder builder, Action configure) { var conn = new RocketMessagingGatewayConnectionBuilder(); @@ -57,7 +57,7 @@ public static RocketMessageProducerFactoryBuilder AddPublication( configure(publicationBuilder); return builder.AddPublication(publicationBuilder.Build()); } - + /// /// Adds a strongly-typed publication configuration for a specific request type /// diff --git a/src/Fluent.Brighter.RocketMQ/RocketMessageProducerFactoryBuilder.cs b/src/Fluent.Brighter.RocketMQ/RocketMessageProducerFactoryBuilder.cs index 7b541f3..cd95102 100644 --- a/src/Fluent.Brighter.RocketMQ/RocketMessageProducerFactoryBuilder.cs +++ b/src/Fluent.Brighter.RocketMQ/RocketMessageProducerFactoryBuilder.cs @@ -28,7 +28,7 @@ public RocketMessageProducerFactoryBuilder SetConnection(RocketMessagingGatewayC _connection = connection; return this; } - + private List _publications = []; /// @@ -66,7 +66,7 @@ internal RocketMessageProducerFactory Build() { throw new ConfigurationException("RocketMQ connection configuration is required. Use SetConnection() to provide gateway settings."); } - + return new RocketMessageProducerFactory(_connection, _publications); } } \ No newline at end of file diff --git a/src/Fluent.Brighter.RocketMQ/RocketMessagingGatewayConnectionBuilder.cs b/src/Fluent.Brighter.RocketMQ/RocketMessagingGatewayConnectionBuilder.cs index 0e54b77..7b5f276 100644 --- a/src/Fluent.Brighter.RocketMQ/RocketMessagingGatewayConnectionBuilder.cs +++ b/src/Fluent.Brighter.RocketMQ/RocketMessagingGatewayConnectionBuilder.cs @@ -28,9 +28,9 @@ public RocketMessagingGatewayConnectionBuilder SetClient(ClientConfig clientConf _clientConfig = clientConfig ?? throw new ArgumentNullException(nameof(clientConfig)); return this; } - + private TimeProvider _timerProvider = TimeProvider.System; - + /// /// Sets the time provider for time-sensitive operations. /// Used for implementing RocketMQ's message delay and timeout features. @@ -44,7 +44,7 @@ public RocketMessagingGatewayConnectionBuilder SetTimerProvider(TimeProvider tim } private int _maxAttempts = 3; - + /// /// Sets the maximum retry attempts for failed message operations. /// Implements RocketMQ's at-least-once delivery guarantee through retries. @@ -57,12 +57,12 @@ public RocketMessagingGatewayConnectionBuilder SetMaxAttempts(int maxAttempts) { throw new ArgumentException("Max attempts must be at least 1", nameof(maxAttempts)); } - + _maxAttempts = maxAttempts; return this; } - - + + private ITransactionChecker? _checker; /// @@ -78,7 +78,7 @@ public RocketMessagingGatewayConnectionBuilder SetTransactionChecker(ITransactio } private InstrumentationOptions _instrumentation = InstrumentationOptions.All; - + /// /// Sets the instrumentation options for the gateway connection. /// @@ -100,7 +100,7 @@ internal RocketMessagingGatewayConnection Build() { throw new ConfigurationException("ClientConfig must be set before calling this method"); } - + return new RocketMessagingGatewayConnection(_clientConfig) { TimerProvider = _timerProvider, diff --git a/src/Fluent.Brighter.RocketMQ/RocketMqConfigurator.cs b/src/Fluent.Brighter.RocketMQ/RocketMqConfigurator.cs index bcfa653..3574b97 100644 --- a/src/Fluent.Brighter.RocketMQ/RocketMqConfigurator.cs +++ b/src/Fluent.Brighter.RocketMQ/RocketMqConfigurator.cs @@ -46,7 +46,7 @@ public RocketMqConfigurator SetConnection(RocketMessagingGatewayConnection conne _connection = connection; return this; } - + /// /// Configures message publications (producers) /// @@ -96,12 +96,12 @@ public RocketMqConfigurator UseSubscriptions(Action { var channel = new RocketMqChannelFactory(new RocketMessageConsumerFactory(_connection!)); - + var configurator = new RocketMqSubscriptionConfigurator(channel); configure(configurator); sub.AddChannelFactory(channel); - + foreach (var subscription in configurator.Subscriptions) { sub.AddRocketMqSubscription(subscription); @@ -110,7 +110,7 @@ public RocketMqConfigurator UseSubscriptions(Action /// Applies the configuration to Brighter's fluent builder (internal) /// @@ -123,7 +123,7 @@ internal void SetFluentBrighter(FluentBrighterBuilder fluentBrighter) { throw new ConfigurationException("RocketMQ connection configuration is required. Use SetConnection() to configure connection settings."); } - + _action(fluentBrighter); } } \ No newline at end of file diff --git a/src/Fluent.Brighter.RocketMQ/RocketMqPublicationBuilder.cs b/src/Fluent.Brighter.RocketMQ/RocketMqPublicationBuilder.cs index d5387fb..9a20df0 100644 --- a/src/Fluent.Brighter.RocketMQ/RocketMqPublicationBuilder.cs +++ b/src/Fluent.Brighter.RocketMQ/RocketMqPublicationBuilder.cs @@ -29,7 +29,7 @@ public RocketMqPublicationBuilder SetDataSchema(Uri? dataSchema) return this; } - private OnMissingChannel _makeChannels = OnMissingChannel.Create; + private OnMissingChannel _makeChannels = OnMissingChannel.Create; /// /// Configures channel creation behavior when missing (default: Create) @@ -159,7 +159,7 @@ public RocketMqPublicationBuilder SetTags(string? tags) _tags = tags; return this; } - + private InstrumentationOptions _instrumentation = InstrumentationOptions.All; /// @@ -179,7 +179,7 @@ public RocketMqPublicationBuilder SetInstrumentation(InstrumentationOptions opti /// Fully configured publication settings internal RocketMqPublication Build() { - return new RocketMqPublication + return new RocketMqPublication { DataSchema = _dataSchema, MakeChannels = _makeChannels, diff --git a/src/Fluent.Brighter.RocketMQ/RocketMqSubscriptionBuilder.cs b/src/Fluent.Brighter.RocketMQ/RocketMqSubscriptionBuilder.cs index 3cfb14e..cc987d6 100644 --- a/src/Fluent.Brighter.RocketMQ/RocketMqSubscriptionBuilder.cs +++ b/src/Fluent.Brighter.RocketMQ/RocketMqSubscriptionBuilder.cs @@ -16,7 +16,7 @@ namespace Fluent.Brighter.RocketMQ; public sealed class RocketSubscriptionBuilder { private SubscriptionName? _subscriptionName; - + /// /// Sets the unique identifier for this subscription /// @@ -27,9 +27,9 @@ public RocketSubscriptionBuilder SetSubscriptionName(SubscriptionName subscripti _subscriptionName = subscriptionName; return this; } - + private RoutingKey? _routingKey; - + /// /// Sets the binding key for topic-based routing /// @@ -40,7 +40,7 @@ public RocketSubscriptionBuilder SetTopic(RoutingKey routingKey) _routingKey = routingKey; return this; } - + private Type? _requestType; /// @@ -53,7 +53,7 @@ public RocketSubscriptionBuilder SetRequestType(Type requestType) _requestType = requestType ?? throw new ArgumentNullException(nameof(requestType)); return this; } - + private Func? _getRequestType; /// @@ -66,10 +66,10 @@ public RocketSubscriptionBuilder SetRequestTypeMapper(Func getReq _getRequestType = getRequestType ?? throw new ArgumentNullException(nameof(getRequestType)); return this; } - + private string? _consumerGroup; private ChannelName? _channelName; - + /// /// Sets the consumer group for RocketMQ message consumption. /// Identifies a group of consumers working as a cluster for parallel processing. @@ -79,10 +79,10 @@ public RocketSubscriptionBuilder SetRequestTypeMapper(Func getReq public RocketSubscriptionBuilder SetConsumerGroup(string consumerGroup) { _consumerGroup = consumerGroup ?? throw new ArgumentNullException(nameof(consumerGroup)); - _channelName = new ChannelName(consumerGroup); + _channelName = new ChannelName(consumerGroup); return this; } - + private int _bufferSize = 1; /// @@ -94,11 +94,11 @@ public RocketSubscriptionBuilder SetBufferSize(int bufferSize) { if (bufferSize < 1 || bufferSize > 10) throw new ArgumentException("Buffer size must be between 1 and 10", nameof(bufferSize)); - + _bufferSize = bufferSize; return this; } - + private int _noOfPerformers = 1; /// @@ -110,11 +110,11 @@ public RocketSubscriptionBuilder SetNoOfPerformers(int noOfPerformers) { if (noOfPerformers < 1) throw new ArgumentException("Number of performers must be at least 1", nameof(noOfPerformers)); - + _noOfPerformers = noOfPerformers; return this; } - + private TimeSpan? _timeOut; /// @@ -127,7 +127,7 @@ public RocketSubscriptionBuilder SetTimeout(TimeSpan timeOut) _timeOut = timeOut; return this; } - + private int _requeueCount = -1; /// @@ -140,7 +140,7 @@ public RocketSubscriptionBuilder SetRequeueCount(int requeueCount) _requeueCount = requeueCount; return this; } - + private TimeSpan? _requeueDelay; /// @@ -153,7 +153,7 @@ public RocketSubscriptionBuilder SetRequeueDelay(TimeSpan requeueDelay) _requeueDelay = requeueDelay; return this; } - + private int _unacceptableMessageLimit = 0; /// @@ -165,11 +165,11 @@ public RocketSubscriptionBuilder SetUnacceptableMessageLimit(int unacceptableMes { if (unacceptableMessageLimit < 0) throw new ArgumentException("Unacceptable message limit cannot be negative", nameof(unacceptableMessageLimit)); - + _unacceptableMessageLimit = unacceptableMessageLimit; return this; } - + private MessagePumpType _messagePumpType = MessagePumpType.Unknown; /// @@ -182,9 +182,9 @@ public RocketSubscriptionBuilder SetMessagePumpType(MessagePumpType messagePumpT _messagePumpType = messagePumpType; return this; } - + private IAmAChannelFactory? _channelFactory; - + /// /// Sets the channel factory for creating message channels. /// @@ -195,7 +195,7 @@ public RocketSubscriptionBuilder SetChannelFactory(IAmAChannelFactory channelFac _channelFactory = channelFactory ?? throw new ArgumentNullException(nameof(channelFactory)); return this; } - + private OnMissingChannel _makeChannels = OnMissingChannel.Create; /// @@ -208,9 +208,9 @@ public RocketSubscriptionBuilder SetMakeChannels(OnMissingChannel makeChannels) _makeChannels = makeChannels; return this; } - + private FilterExpression? _filter; - + /// /// Sets the message filter expression for RocketMQ topic filtering. /// Supports RocketMQ's tag-based or SQL-style message filtering. @@ -222,9 +222,9 @@ public RocketSubscriptionBuilder SetFilter(FilterExpression filter) _filter = filter ?? throw new ArgumentNullException(nameof(filter)); return this; } - + private TimeSpan? _emptyChannelDelay; - + /// /// Sets the delay when a channel is empty. /// @@ -235,7 +235,7 @@ public RocketSubscriptionBuilder SetEmptyChannelDelay(TimeSpan emptyChannelDelay _emptyChannelDelay = emptyChannelDelay; return this; } - + private TimeSpan? _channelFailureDelay; /// @@ -250,7 +250,7 @@ public RocketSubscriptionBuilder SetChannelFailureDelay(TimeSpan channelFailureD } private TimeSpan? _receiveMessageTimeout; - + /// /// Sets the timeout for receiving messages from RocketMQ brokers. /// Controls the maximum time to wait for new messages during polling. @@ -264,7 +264,7 @@ public RocketSubscriptionBuilder SetReceiveMessageTimeout(TimeSpan receiveMessag } private TimeSpan? _invisibilityTimeout; - + /// /// Sets the invisibility timeout for consumed messages. /// Determines how long messages remain invisible after being received. @@ -297,7 +297,7 @@ internal RocketSubscription Build() { throw new ConfigurationException("Routing key not set"); } - + return new RocketSubscription( _subscriptionName, _channelName, diff --git a/src/Fluent.Brighter.RocketMQ/RocketMqSubscriptionConfigurator.cs b/src/Fluent.Brighter.RocketMQ/RocketMqSubscriptionConfigurator.cs index ca1d121..3ffc08d 100644 --- a/src/Fluent.Brighter.RocketMQ/RocketMqSubscriptionConfigurator.cs +++ b/src/Fluent.Brighter.RocketMQ/RocketMqSubscriptionConfigurator.cs @@ -48,7 +48,7 @@ public RocketMqSubscriptionConfigurator AddSubscription(Action /// Adds and configures a strongly-typed RocketMQ subscription /// diff --git a/src/Fluent.Brighter.SqlServer/Extensions/ConsumerBuilderExtensions.cs b/src/Fluent.Brighter.SqlServer/Extensions/ConsumerBuilderExtensions.cs index 1ba636c..4791363 100644 --- a/src/Fluent.Brighter.SqlServer/Extensions/ConsumerBuilderExtensions.cs +++ b/src/Fluent.Brighter.SqlServer/Extensions/ConsumerBuilderExtensions.cs @@ -36,15 +36,15 @@ public static ConsumerBuilder AddMicrosoftSqlServerSubscription(this ConsumerBui Action configure) { if (configure == null) - { + { throw new ArgumentNullException(nameof(configure)); } - + var sub = new SqlServerSubscriptionBuilder(); configure(sub); return builder.AddSubscription(sub.Build()); } - + /// /// Adds a SQL Server subscription for a specific request type , /// automatically setting the data type and allowing further customization. @@ -59,16 +59,16 @@ public static ConsumerBuilder AddMicrosoftSqlServerSubscription(this C where TRequest : class, IRequest { if (configure == null) - { + { throw new ArgumentNullException(nameof(configure)); } - + var sub = new SqlServerSubscriptionBuilder(); sub.SetDataType(typeof(TRequest)); configure(sub); return builder.AddSubscription(sub.Build()); } - + /// /// Configures the consumer to use a SQL Server-based inbox for message deduplication, /// using a fluent configuration action for database settings (e.g., connection string, schema). @@ -77,14 +77,14 @@ public static ConsumerBuilder AddMicrosoftSqlServerSubscription(this C /// An action that configures the relational database connection. /// The updated to allow method chaining. /// Thrown if is null. - public static ConsumerBuilder UseMicrosoftSqlServerInbox(this ConsumerBuilder builder, + public static ConsumerBuilder UseMicrosoftSqlServerInbox(this ConsumerBuilder builder, Action configure) { if (configure == null) - { + { throw new ArgumentNullException(nameof(configure)); } - + var configuration = new RelationalDatabaseConfigurationBuilder(); configure(configuration); return builder.UseMicrosoftSqlServerInbox(configuration.Build()); @@ -115,7 +115,7 @@ public static ConsumerBuilder UseMicrosoftSqlServerInbox(this ConsumerBuilder bu { throw new ArgumentNullException(nameof(configure)); } - + var inbox = new SqlServerInboxBuilder(); configure(inbox); return builder.SetInbox(cfg => cfg.SetInbox(inbox.Build())); diff --git a/src/Fluent.Brighter.SqlServer/Extensions/FluentBrighterExtensions.cs b/src/Fluent.Brighter.SqlServer/Extensions/FluentBrighterExtensions.cs index 33cc2e8..bf0e3d2 100644 --- a/src/Fluent.Brighter.SqlServer/Extensions/FluentBrighterExtensions.cs +++ b/src/Fluent.Brighter.SqlServer/Extensions/FluentBrighterExtensions.cs @@ -26,7 +26,7 @@ public static FluentBrighterBuilder UsingMicrosoftSqlServer(this FluentBrighterB { throw new ArgumentNullException(nameof(configure)); } - + var configurator = new SqlServerConfigurator(); configure(configurator); configurator.SetFluentBrighter(builder); diff --git a/src/Fluent.Brighter.SqlServer/Extensions/ProducersExtensions.cs b/src/Fluent.Brighter.SqlServer/Extensions/ProducersExtensions.cs index b9b3980..d12c509 100644 --- a/src/Fluent.Brighter.SqlServer/Extensions/ProducersExtensions.cs +++ b/src/Fluent.Brighter.SqlServer/Extensions/ProducersExtensions.cs @@ -62,7 +62,7 @@ public static ProducerBuilder UseMicrosoftSqlServerOutbox(this ProducerBuilder b { return builder.UseMicrosoftSqlServerOutbox(cfg => cfg.SetConfiguration(configuration ?? throw new ArgumentNullException(nameof(configuration)))); } - + /// /// Configures the producer to use a SQL Server-based outbox via a fully customized . /// Allows advanced setup such as custom connection providers. @@ -80,7 +80,7 @@ public static ProducerBuilder UseMicrosoftSqlServerOutbox(this ProducerBuilder b .SetTransactionProvider(typeof(MsSqlTransactionProvider)); return builder; } - + /// /// Configures the producer to use a SQL Server-based distributed lock provider with the given connection string. /// Used to coordinate singleton or exclusive message processing across multiple instances. @@ -95,7 +95,7 @@ public static ProducerBuilder UseMicrosoftSqlServerDistributedLock(this Producer { throw new ArgumentException("Connection string cannot be null or empty.", nameof(connectionString)); } - + return builder.UseMicrosoftSqlServerDistributedLock(new RelationalDatabaseConfiguration(connectionString)); } diff --git a/src/Fluent.Brighter.SqlServer/Extensions/SqlServerMessageProducerFactoryBuilderExtensions.cs b/src/Fluent.Brighter.SqlServer/Extensions/SqlServerMessageProducerFactoryBuilderExtensions.cs index 890b03a..eb15d2a 100644 --- a/src/Fluent.Brighter.SqlServer/Extensions/SqlServerMessageProducerFactoryBuilderExtensions.cs +++ b/src/Fluent.Brighter.SqlServer/Extensions/SqlServerMessageProducerFactoryBuilderExtensions.cs @@ -34,7 +34,7 @@ public static SqlServerMessageProducerFactoryBuilder SetConnection( { throw new ArgumentNullException(nameof(configure)); } - + var configuration = new RelationalDatabaseConfigurationBuilder(); configure(configuration); return builder.SetConnection(configuration.Build()); @@ -59,7 +59,7 @@ public static SqlServerMessageProducerFactoryBuilder AddPublication( { throw new ArgumentNullException(nameof(configure)); } - + var publication = new SqlServerPublicationBuilder(); configure(publication); return builder.AddPublication(publication.Build()); @@ -83,7 +83,7 @@ public static SqlServerMessageProducerFactoryBuilder AddPublication( { throw new ArgumentNullException(nameof(configure)); } - + var publication = new SqlServerPublicationBuilder(); publication.SetRequestType(typeof(TRequest)); configure(publication); diff --git a/src/Fluent.Brighter.SqlServer/Extensions/SqlServerOutboxBuilderExtensions.cs b/src/Fluent.Brighter.SqlServer/Extensions/SqlServerOutboxBuilderExtensions.cs index d2b656d..d002542 100644 --- a/src/Fluent.Brighter.SqlServer/Extensions/SqlServerOutboxBuilderExtensions.cs +++ b/src/Fluent.Brighter.SqlServer/Extensions/SqlServerOutboxBuilderExtensions.cs @@ -26,7 +26,7 @@ public static SqlServerOutboxBuilder SetConfiguration(this SqlServerOutboxBuilde { throw new ArgumentNullException(nameof(configure)); } - + var configuration = new RelationalDatabaseConfigurationBuilder(); configure(configuration); return builder.SetConfiguration(configuration.Build()); diff --git a/src/Fluent.Brighter.SqlServer/SqlServerConfigurator.cs b/src/Fluent.Brighter.SqlServer/SqlServerConfigurator.cs index 0f11355..a16b434 100644 --- a/src/Fluent.Brighter.SqlServer/SqlServerConfigurator.cs +++ b/src/Fluent.Brighter.SqlServer/SqlServerConfigurator.cs @@ -35,7 +35,7 @@ public SqlServerConfigurator SetConnection(Action fluent.Subscriptions(s => s.UseMicrosoftSqlServerInbox(c => { c.SetConnectionString(_configuration!.ConnectionString); @@ -121,7 +121,7 @@ public SqlServerConfigurator UseOutbox(Action fluent.Producers(s => s.UseMicrosoftSqlServerOutbox(c => { c.SetConnectionString(_configuration!.ConnectionString); @@ -143,7 +143,7 @@ public SqlServerConfigurator UsePublications(Action { fluent.Producers(producer => producer @@ -170,7 +170,7 @@ public SqlServerConfigurator UseSubscriptions(Action { fluent.Subscriptions(sub => diff --git a/src/Fluent.Brighter.SqlServer/SqlServerInboxBuilder.cs b/src/Fluent.Brighter.SqlServer/SqlServerInboxBuilder.cs index f816bb8..a36a129 100644 --- a/src/Fluent.Brighter.SqlServer/SqlServerInboxBuilder.cs +++ b/src/Fluent.Brighter.SqlServer/SqlServerInboxBuilder.cs @@ -37,7 +37,7 @@ public SqlServerInboxBuilder SetConnectionProvider(IAmARelationalDbConnectionPro _connectionProvider = connectionProvider; return this; } - + /// /// Builds and returns a configured instance of . /// diff --git a/src/Fluent.Brighter.SqlServer/SqlServerMessageProducerFactoryBuilder.cs b/src/Fluent.Brighter.SqlServer/SqlServerMessageProducerFactoryBuilder.cs index 2b29848..f63e0c5 100644 --- a/src/Fluent.Brighter.SqlServer/SqlServerMessageProducerFactoryBuilder.cs +++ b/src/Fluent.Brighter.SqlServer/SqlServerMessageProducerFactoryBuilder.cs @@ -26,7 +26,7 @@ public SqlServerMessageProducerFactoryBuilder SetConnection(RelationalDatabaseCo _configuration = connection ?? throw new ArgumentNullException(nameof(connection)); return this; } - + private readonly List _publications = []; /// @@ -53,7 +53,7 @@ internal MsSqlMessageProducerFactory Build() { throw new ConfigurationException("No configuration configured"); } - + return new MsSqlMessageProducerFactory(_configuration, _publications); } } \ No newline at end of file diff --git a/src/Fluent.Brighter.SqlServer/SqlServerOutboxBuilder.cs b/src/Fluent.Brighter.SqlServer/SqlServerOutboxBuilder.cs index 603fafd..5f10182 100644 --- a/src/Fluent.Brighter.SqlServer/SqlServerOutboxBuilder.cs +++ b/src/Fluent.Brighter.SqlServer/SqlServerOutboxBuilder.cs @@ -31,7 +31,7 @@ public SqlServerOutboxBuilder SetConfiguration(IAmARelationalDatabaseConfigurati { throw new ArgumentNullException(nameof(configuration)); } - + _configuration = configuration; return this; } @@ -49,7 +49,7 @@ public SqlServerOutboxBuilder SetConnectionProvider(IAmARelationalDbConnectionPr _connectionProvider = connectionProvider; return this; } - + /// /// Builds and returns a configured instance of . /// diff --git a/src/Fluent.Brighter.SqlServer/SqlServerSubscriptionBuilder.cs b/src/Fluent.Brighter.SqlServer/SqlServerSubscriptionBuilder.cs index 85f8b7b..90cf580 100644 --- a/src/Fluent.Brighter.SqlServer/SqlServerSubscriptionBuilder.cs +++ b/src/Fluent.Brighter.SqlServer/SqlServerSubscriptionBuilder.cs @@ -23,7 +23,7 @@ public SqlServerSubscriptionBuilder SetSubscription(SubscriptionName subscriptio _subscriptionName = subscriptionName; return this; } - + private ChannelName? _channelName; private RoutingKey? _routingKey; @@ -42,7 +42,7 @@ public SqlServerSubscriptionBuilder SetQueue(ChannelName channelName) _routingKey = new RoutingKey(channelName.Value); return this; } - + private Type? _dataType; /// @@ -59,7 +59,7 @@ public SqlServerSubscriptionBuilder SetDataType(Type? dataType) { return this; } - + if (_subscriptionName == null) { _subscriptionName = new SubscriptionName(dataType.ToString()); @@ -74,10 +74,10 @@ public SqlServerSubscriptionBuilder SetDataType(Type? dataType) { _routingKey = new RoutingKey(dataType.Name); } - + return this; } - + private Func? _getRequestType; /// @@ -104,7 +104,7 @@ public SqlServerSubscriptionBuilder SetBufferSize(int bufferSize) _bufferSize = bufferSize; return this; } - + private int _noOfPerformers = 1; /// @@ -118,7 +118,7 @@ public SqlServerSubscriptionBuilder SetNumberOfPerformers(int noOfPerformers) _noOfPerformers = noOfPerformers; return this; } - + private TimeSpan? _timeOut; /// @@ -132,7 +132,7 @@ public SqlServerSubscriptionBuilder SetTimeout(TimeSpan? timeout) _timeOut = timeout; return this; } - + private int _requeueCount = -1; /// @@ -146,7 +146,7 @@ public SqlServerSubscriptionBuilder SetRequeueCount(int requeueCount) _requeueCount = requeueCount; return this; } - + private TimeSpan? _requeueDelay; /// @@ -159,7 +159,7 @@ public SqlServerSubscriptionBuilder SetRequeueDelay(TimeSpan? requeueDelay) _requeueDelay = requeueDelay; return this; } - + private int _unacceptableMessageLimit; /// @@ -173,7 +173,7 @@ public SqlServerSubscriptionBuilder SetUnacceptableMessageLimit(int unacceptable _unacceptableMessageLimit = unacceptableMessageLimit; return this; } - + private MessagePumpType _messagePumpType = MessagePumpType.Proactor; /// @@ -200,7 +200,7 @@ public SqlServerSubscriptionBuilder SetChannelFactory(IAmAChannelFactory? channe _channelFactory = channelFactory; return this; } - + private OnMissingChannel _onMissingChannel = OnMissingChannel.Create; /// @@ -240,7 +240,7 @@ public SqlServerSubscriptionBuilder SetChannelFailureDelay(TimeSpan? channelFail _channelFailureDelay = channelFailureDelay; return this; } - + /// /// Builds and returns a configured instance. /// @@ -254,7 +254,7 @@ internal MsSqlSubscription Build() { throw new ConfigurationException("SubscriptionName not set"); } - + if (_channelName == null) { throw new ConfigurationException("ChannelName not set"); @@ -264,7 +264,7 @@ internal MsSqlSubscription Build() { throw new ConfigurationException("RoutingKey not set"); } - + return new MsSqlSubscription( subscriptionName: _subscriptionName, channelName: _channelName, @@ -280,7 +280,7 @@ internal MsSqlSubscription Build() messagePumpType: _messagePumpType, channelFactory: _channelFactory, makeChannels: _onMissingChannel, - emptyChannelDelay: _emptyChannelDelay, + emptyChannelDelay: _emptyChannelDelay, channelFailureDelay: _channelFailureDelay); } } \ No newline at end of file diff --git a/src/Fluent.Brighter.Sqlite/Extensions/ProducersExtensions.cs b/src/Fluent.Brighter.Sqlite/Extensions/ProducersExtensions.cs index 3098be1..f93b960 100644 --- a/src/Fluent.Brighter.Sqlite/Extensions/ProducersExtensions.cs +++ b/src/Fluent.Brighter.Sqlite/Extensions/ProducersExtensions.cs @@ -36,7 +36,7 @@ public static ProducerBuilder UseSqliteOutbox(this ProducerBuilder builder, { return builder.UseSqliteOutbox(cfg => cfg.SetConfiguration(configuration)); } - + /// /// Configures a SQLite outbox using a custom outbox builder configuration /// diff --git a/src/Fluent.Brighter.Sqlite/SqliteConfigurator.cs b/src/Fluent.Brighter.Sqlite/SqliteConfigurator.cs index c37e1ce..99fafc3 100644 --- a/src/Fluent.Brighter.Sqlite/SqliteConfigurator.cs +++ b/src/Fluent.Brighter.Sqlite/SqliteConfigurator.cs @@ -16,7 +16,7 @@ public sealed class SqliteConfigurator { private RelationalDatabaseConfiguration? _configuration; private Action _action = _ => { }; - + /// /// Configures the SQLite database connection using a fluent builder /// @@ -24,7 +24,7 @@ public sealed class SqliteConfigurator /// This configurator for method chaining public SqliteConfigurator SetConnection(Action configuration) { - var builder = new RelationalDatabaseConfigurationBuilder(); + var builder = new RelationalDatabaseConfigurationBuilder(); configuration(builder); return SetConnection(builder.Build()); } @@ -80,7 +80,7 @@ internal void SetFluentBrighter(FluentBrighterBuilder fluentBrighter) throw new ConfigurationException("SQLite database configuration is missing. " + "You must set the connection using SetConnection() before enabling features. "); } - + _action(fluentBrighter); } } \ No newline at end of file diff --git a/src/Fluent.Brighter.Sqlite/SqliteInboxBuilder.cs b/src/Fluent.Brighter.Sqlite/SqliteInboxBuilder.cs index a96708a..348d535 100644 --- a/src/Fluent.Brighter.Sqlite/SqliteInboxBuilder.cs +++ b/src/Fluent.Brighter.Sqlite/SqliteInboxBuilder.cs @@ -33,7 +33,7 @@ public SqliteInboxBuilder SetConnectionProvider(IAmARelationalDbConnectionProvid _connectionProvider = connectionProvider; return this; } - + /// /// Constructs the SQLite inbox configuration /// @@ -46,9 +46,9 @@ internal SqliteInbox Build() throw new ConfigurationException("SQLite inbox configuration is missing. " + "You must provide database configuration using SetConfiguration() before building. "); } - - return _connectionProvider == null - ? new SqliteInbox(_configuration) + + return _connectionProvider == null + ? new SqliteInbox(_configuration) : new SqliteInbox(_configuration, _connectionProvider); } } \ No newline at end of file diff --git a/src/Fluent.Brighter.Sqlite/SqliteOutboxBuilder.cs b/src/Fluent.Brighter.Sqlite/SqliteOutboxBuilder.cs index f9d53fe..c8ddcc6 100644 --- a/src/Fluent.Brighter.Sqlite/SqliteOutboxBuilder.cs +++ b/src/Fluent.Brighter.Sqlite/SqliteOutboxBuilder.cs @@ -34,7 +34,7 @@ public SqliteOutboxBuilder SetConnectionProvider(IAmARelationalDbConnectionProvi _connectionProvider = connectionProvider; return this; } - + /// /// Constructs the SQLite outbox configuration /// @@ -47,9 +47,9 @@ internal SqliteOutbox Build() throw new ConfigurationException("SQLite outbox configuration is missing. " + "You must provide database configuration using SetConfiguration() before building. "); } - - return _connectionProvider == null - ? new SqliteOutbox(_configuration) + + return _connectionProvider == null + ? new SqliteOutbox(_configuration) : new SqliteOutbox(_configuration, _connectionProvider); } } \ No newline at end of file diff --git a/src/Fluent.Brighter/ConsumerBuilder.cs b/src/Fluent.Brighter/ConsumerBuilder.cs index d097a96..6e5bd3b 100644 --- a/src/Fluent.Brighter/ConsumerBuilder.cs +++ b/src/Fluent.Brighter/ConsumerBuilder.cs @@ -25,7 +25,7 @@ namespace Fluent.Brighter; public sealed class ConsumerBuilder { private ServiceLifetime _handlerLifetime = ServiceLifetime.Transient; - + /// /// Sets the service lifetime for message handlers /// @@ -144,7 +144,7 @@ public ConsumerBuilder SetResiliencePipelineRegistry( _resiliencePipelineRegistry = resiliencePipelineRegistry; return this; } - + /// /// Adds a resilience pipeline to the registry /// @@ -171,7 +171,7 @@ public ConsumerBuilder AddResiliencePipeline(string key, } private IAmAChannelFactory? _defaultChannelFactory; - + /// /// Sets the default channel factory for message consumption /// @@ -184,7 +184,7 @@ public ConsumerBuilder SetDefaultChannelFactory(IAmAChannelFactory? channelFacto } private readonly List _channelFactories = []; - + /// /// Adds a channel factory to the configuration /// @@ -195,7 +195,7 @@ public ConsumerBuilder AddChannelFactory(IAmAChannelFactory channelFactory) _channelFactories.Add(channelFactory); return this; } - + /// /// Configures the inbox settings for idempotency /// @@ -210,9 +210,9 @@ public ConsumerBuilder SetInbox(InboxConfiguration inboxConfiguration) .SetOnceOnly(inboxConfiguration.OnceOnly) .SetScope(inboxConfiguration.Scope)); } - + private readonly InboxConfigurationBuilder _inboxConfigurationBuilder = new(); - + /// /// Configures the inbox using a builder action /// @@ -236,7 +236,7 @@ public ConsumerBuilder SetSubscriptions(IEnumerable subscriptions) _subscriptions = subscriptions.ToList(); return this; } - + /// /// Adds a single subscription /// @@ -260,14 +260,14 @@ public ConsumerBuilder SetConfiguration(Action configuration) _configuration = configuration; return this; } - + internal void SetConsumerOptions(ConsumersOptions options) { if (_defaultChannelFactory == null && _channelFactories.Count > 0) { _defaultChannelFactory = new CombinedChannelFactory(_channelFactories); } - + options.HandlerLifetime = _handlerLifetime; options.MapperLifetime = _mapperLifetime; options.TransformerLifetime = _transformerLifetime; @@ -278,11 +278,11 @@ internal void SetConsumerOptions(ConsumersOptions options) #pragma warning disable CS0618 // Type or member is obsolete options.PolicyRegistry = _policyRegistry; #pragma warning restore CS0618 // Type or member is obsolete - + options.DefaultChannelFactory = _defaultChannelFactory; options.InboxConfiguration = _inboxConfigurationBuilder.Build(); options.Subscriptions = _subscriptions; - + _configuration?.Invoke(options); } } \ No newline at end of file diff --git a/src/Fluent.Brighter/Extensions/ConsumerBuilderExtensions.cs b/src/Fluent.Brighter/Extensions/ConsumerBuilderExtensions.cs index 1dfdf89..ad713e0 100644 --- a/src/Fluent.Brighter/Extensions/ConsumerBuilderExtensions.cs +++ b/src/Fluent.Brighter/Extensions/ConsumerBuilderExtensions.cs @@ -10,13 +10,13 @@ namespace Fluent.Brighter; public static class ConsumerBuilderExtensions { #region Handlers - + /// /// Configures message handlers as singleton services /// /// The ConsumerBuilder instance /// The ConsumerBuilder for fluent chaining - public static ConsumerBuilder UseHandlersAsSingleton(this ConsumerBuilder consumerBuilder) + public static ConsumerBuilder UseHandlersAsSingleton(this ConsumerBuilder consumerBuilder) => consumerBuilder.SetHandlerLifetime(ServiceLifetime.Singleton); /// @@ -26,7 +26,7 @@ public static ConsumerBuilder UseHandlersAsSingleton(this ConsumerBuilder consum /// The ConsumerBuilder for fluent chaining public static ConsumerBuilder UseHandlersAsScoped(this ConsumerBuilder consumerBuilder) => consumerBuilder.SetHandlerLifetime(ServiceLifetime.Scoped); - + /// /// Configures message handlers as transient services /// @@ -35,15 +35,15 @@ public static ConsumerBuilder UseHandlersAsScoped(this ConsumerBuilder consumerB public static ConsumerBuilder UseHandlersAsTransient(this ConsumerBuilder consumerBuilder) => consumerBuilder.SetHandlerLifetime(ServiceLifetime.Transient); #endregion - + #region Message Mapper - + /// /// Configures message mappers as singleton services /// /// The ConsumerBuilder instance /// The ConsumerBuilder for fluent chaining - public static ConsumerBuilder UseMappersAsSingleton(this ConsumerBuilder consumerBuilder) + public static ConsumerBuilder UseMappersAsSingleton(this ConsumerBuilder consumerBuilder) => consumerBuilder.SetMapperLifetime(ServiceLifetime.Singleton); /// @@ -62,15 +62,15 @@ public static ConsumerBuilder UseMappersAsScoped(this ConsumerBuilder consumerBu public static ConsumerBuilder UseMappersAsTransient(this ConsumerBuilder consumerBuilder) => consumerBuilder.SetMapperLifetime(ServiceLifetime.Transient); #endregion - + #region Transformer - + /// /// Configures message transformers as singleton services /// /// The ConsumerBuilder instance /// The ConsumerBuilder for fluent chaining - public static ConsumerBuilder UseTransformersAsSingleton(this ConsumerBuilder consumerBuilder) + public static ConsumerBuilder UseTransformersAsSingleton(this ConsumerBuilder consumerBuilder) => consumerBuilder.SetTransformerLifetime(ServiceLifetime.Singleton); /// diff --git a/src/Fluent.Brighter/Extensions/MapperBuilderExtensions.cs b/src/Fluent.Brighter/Extensions/MapperBuilderExtensions.cs index b2dd1de..adb5555 100644 --- a/src/Fluent.Brighter/Extensions/MapperBuilderExtensions.cs +++ b/src/Fluent.Brighter/Extensions/MapperBuilderExtensions.cs @@ -21,7 +21,7 @@ public static MapperBuilder SetCloudEventJsonAsDefaultMapper(this MapperBuilder { return mapperBuilder.SetDefaultMapper(typeof(CloudEventJsonMessageMapper<>)); } - + /// /// Sets standard JSON as the default message mapper for the Brighter configuration. /// diff --git a/src/Fluent.Brighter/InboxConfigurationBuilder.cs b/src/Fluent.Brighter/InboxConfigurationBuilder.cs index e41468b..d4dce17 100644 --- a/src/Fluent.Brighter/InboxConfigurationBuilder.cs +++ b/src/Fluent.Brighter/InboxConfigurationBuilder.cs @@ -15,7 +15,7 @@ namespace Fluent.Brighter; public sealed class InboxConfigurationBuilder { private IAmAnInbox? _inbox; - + /// /// Sets the inbox implementation to use for message tracking /// @@ -28,7 +28,7 @@ public InboxConfigurationBuilder SetInbox(IAmAnInbox? inbox) } private InboxScope _scope = InboxScope.All; - + /// /// Sets the scope of messages to apply inbox processing to /// @@ -41,9 +41,9 @@ public InboxConfigurationBuilder SetScope(InboxScope scope) return this; } - - private bool _onceOnly = true; - + + private bool _onceOnly = true; + /// /// Enables or disables once-only processing (idempotency guarantee) /// @@ -55,9 +55,9 @@ public InboxConfigurationBuilder SetOnceOnly(bool onceOnly) return this; } - - private OnceOnlyAction _actionOnExists = OnceOnlyAction.Throw; - + + private OnceOnlyAction _actionOnExists = OnceOnlyAction.Throw; + /// /// Sets the action to take when a duplicate message is detected /// @@ -70,9 +70,9 @@ public InboxConfigurationBuilder SetActionOnExists(OnceOnlyAction actionOnExists return this; } - + private Func? _context; - + /// /// Sets the context provider function for generating unique message identifiers /// diff --git a/src/Fluent.Brighter/MapperBuilder.cs b/src/Fluent.Brighter/MapperBuilder.cs index 0084b47..6382860 100644 --- a/src/Fluent.Brighter/MapperBuilder.cs +++ b/src/Fluent.Brighter/MapperBuilder.cs @@ -30,12 +30,12 @@ public sealed class MapperBuilder public MapperBuilder() { _assemblies.AddRange(AppDomain.CurrentDomain.GetAssemblies().Where(a => - !a.IsDynamic - && a.FullName?.StartsWith("Microsoft.", true, CultureInfo.InvariantCulture) == false + !a.IsDynamic + && a.FullName?.StartsWith("Microsoft.", true, CultureInfo.InvariantCulture) == false && a.FullName?.StartsWith("System.", true, CultureInfo.InvariantCulture) == false && a.FullName?.StartsWith("Paramore.Brighter", true, CultureInfo.InvariantCulture) == false)); } - + /// /// Specifies specific assemblies to scan for message mappers /// @@ -70,7 +70,7 @@ public MapperBuilder AddMapper() return this; } - + /// /// Registers a mapper that handles synchronous mapping for a request type /// @@ -88,7 +88,7 @@ public MapperBuilder AddMapperSync() return this; } - + /// /// Registers a mapper that handles asynchronous mapping for a request type /// @@ -106,7 +106,7 @@ public MapperBuilder AddMapperAsync() return this; } - + private Type? _defaultMapperSync; private Type? _defaultMapperAsync; @@ -121,7 +121,7 @@ public MapperBuilder SetDefaultMapper(Type defaultMapper) _defaultMapperAsync = defaultMapper; return this; } - + /// /// Sets the default mapper type for synchronous operations /// @@ -132,7 +132,7 @@ public MapperBuilder SetDefaultMapperSync(Type defaultMapper) _defaultMapperSync = defaultMapper; return this; } - + /// /// Sets the default mapper type for asynchronous operations /// @@ -143,7 +143,7 @@ public MapperBuilder SetDefaultMapperAsync(Type defaultMapper) _defaultMapperAsync = defaultMapper; return this; } - + private Action? _configure; /// diff --git a/src/Fluent.Brighter/ProducerBuilder.cs b/src/Fluent.Brighter/ProducerBuilder.cs index 8e7dc46..529164b 100644 --- a/src/Fluent.Brighter/ProducerBuilder.cs +++ b/src/Fluent.Brighter/ProducerBuilder.cs @@ -31,9 +31,9 @@ public ProducerBuilder SetArchiveBatchSize(int archiveBatchSize) _archiveBatchSize = archiveBatchSize; return this; } - + private IAmAnArchiveProvider? _archiveProvider; - + /// /// Sets the archive provider for message storage (optional) /// @@ -44,7 +44,7 @@ public ProducerBuilder SetArchiveProvider(IAmAnArchiveProvider archiveProvider) _archiveProvider = archiveProvider; return this; } - + private Type? _connectionProvider; /// @@ -57,8 +57,8 @@ public ProducerBuilder SetConnectionProvider(Type connectionProvider) _connectionProvider = connectionProvider; return this; } - - private Type? _transactionProvider ; + + private Type? _transactionProvider; /// /// Sets the transaction provider type for managing transactions (optional) @@ -70,7 +70,7 @@ public ProducerBuilder SetTransactionProvider(Type transactionProvider) _transactionProvider = transactionProvider; return this; } - + private IDistributedLock? _distributedLock; /// @@ -83,7 +83,7 @@ public ProducerBuilder SetDistributedLock(IDistributedLock distributedLock) _distributedLock = distributedLock; return this; } - + private IAmAnOutbox? _outbox; /// @@ -111,7 +111,7 @@ public ProducerBuilder SetOutboxBulkChunkSize(int outboxBulkChunkSize) } private int? _outboxTimeout; - + /// /// Sets the timeout for outbox operations (optional) /// @@ -171,11 +171,11 @@ public ProducerBuilder SetMaxOutStandingCheckInterval(TimeSpan maxOutStandingChe /// The builder instance for fluent chaining public ProducerBuilder SetProducerRegistry(IAmAProducerRegistry producerRegistry) { - _producerRegistry = producerRegistry; + _producerRegistry = producerRegistry; return this; } - private List _messageProducerFactories = []; + private readonly List _messageProducerFactories = []; /// /// Adds a message producer factory to the configuration (optional) @@ -225,7 +225,7 @@ public ProducerBuilder SetDefaultReplyChannelFactory(IAmAChannelFactory defaultR _defaultReplyChannelFactory = defaultReplyChannelFactory; return this; } - + private IAmARequestContextFactory? _defaultRequestContextFactory; /// @@ -264,7 +264,7 @@ public ProducerBuilder SetInstrumentation(InstrumentationOptions instrumentation _instrumentation = instrumentation; return this; } - + private Action? _configuration; /// @@ -280,15 +280,20 @@ public ProducerBuilder SetConfiguration(Action configura internal void SetProducer(IBrighterBuilder builder) { + if (_producerRegistry == null && _messageProducerFactories.Count == 0 && _configuration == null) + { + return; + } + builder.AddProducers(producer => { producer.ArchiveBatchSize = _archiveBatchSize; producer.ArchiveProvider = _archiveProvider; - + producer.ConnectionProvider = _connectionProvider; - producer.TransactionProvider = _transactionProvider; + producer.TransactionProvider = _transactionProvider; producer.DistributedLock = _distributedLock; - + producer.Outbox = _outbox; producer.OutboxBulkChunkSize = _outboxBulkChunkSize; producer.OutboxTimeout = _outboxTimeout; @@ -298,15 +303,15 @@ internal void SetProducer(IBrighterBuilder builder) { builder.Services.AddSingleton(producer.Outbox); } - + producer.MaxOutStandingMessages = _maxOutStandingMessages; producer.MaxOutStandingCheckInterval = _maxOutStandingCheckInterval; - if (_producerRegistry == null && _messageProducerFactories.Count > 0 ) + if (_producerRegistry == null && _messageProducerFactories.Count > 0) { _producerRegistry = new CombinedProducerRegistryFactory(_messageProducerFactories.ToArray()).Create(); } - + producer.ProducerRegistry = _producerRegistry; producer.ReplyQueueSubscriptions = _replySubscriptions; @@ -315,7 +320,7 @@ internal void SetProducer(IBrighterBuilder builder) producer.MessageSchedulerFactory = _messageSchedulerFactory; producer.InstrumentationOptions = _instrumentation; - + _configuration?.Invoke(producer); }); } diff --git a/src/Fluent.Brighter/RelationalDatabaseConfigurationBuilder.cs b/src/Fluent.Brighter/RelationalDatabaseConfigurationBuilder.cs index e60bd63..4692108 100644 --- a/src/Fluent.Brighter/RelationalDatabaseConfigurationBuilder.cs +++ b/src/Fluent.Brighter/RelationalDatabaseConfigurationBuilder.cs @@ -25,7 +25,7 @@ public RelationalDatabaseConfigurationBuilder SetConnectionString(string connect } private string? _databaseName; - + /// /// Sets the database name (optional) /// @@ -37,9 +37,9 @@ public RelationalDatabaseConfigurationBuilder SetDatabaseName(string? databaseNa return this; } - + private string? _outBoxTableName; - + /// /// Sets the outbox table name (optional) /// @@ -51,9 +51,9 @@ public RelationalDatabaseConfigurationBuilder SetOutboxTableName(string? outBoxT return this; } - + private string? _inboxTableName; - + /// /// Sets the inbox table name (optional) /// @@ -66,7 +66,7 @@ public RelationalDatabaseConfigurationBuilder SetInboxTableName(string? inboxTab } private string? _queueStoreTable; - + /// /// Sets the queue store table name (optional) /// @@ -79,7 +79,7 @@ public RelationalDatabaseConfigurationBuilder SetQueueStoreTable(string? queueSt } private string? _schemaName; - + /// /// Sets the database schema name (optional) /// @@ -92,7 +92,7 @@ public RelationalDatabaseConfigurationBuilder SetSchemaName(string? schemaName) } private bool _binaryMessagePayload; - + /// /// Configures whether message payloads should be stored as binary (optional) /// @@ -121,7 +121,7 @@ public RelationalDatabaseConfiguration Build() } return new RelationalDatabaseConfiguration( - connectionString: _connectionString!, + connectionString: _connectionString!, databaseName: _databaseName, outBoxTableName: _outBoxTableName, inboxTableName: _inboxTableName, @@ -129,5 +129,5 @@ public RelationalDatabaseConfiguration Build() schemaName: _schemaName, binaryMessagePayload: _binaryMessagePayload ); - } + } } \ No newline at end of file diff --git a/src/Fluent.Brighter/RequestHandlerBuilder.cs b/src/Fluent.Brighter/RequestHandlerBuilder.cs index e83a687..28fbd64 100644 --- a/src/Fluent.Brighter/RequestHandlerBuilder.cs +++ b/src/Fluent.Brighter/RequestHandlerBuilder.cs @@ -30,8 +30,8 @@ public sealed class RequestHandlerBuilder public RequestHandlerBuilder() { _assemblies.AddRange(AppDomain.CurrentDomain.GetAssemblies().Where(a => - !a.IsDynamic - && a.FullName?.StartsWith("Microsoft.", true, CultureInfo.InvariantCulture) == false + !a.IsDynamic + && a.FullName?.StartsWith("Microsoft.", true, CultureInfo.InvariantCulture) == false && a.FullName?.StartsWith("System.", true, CultureInfo.InvariantCulture) == false && a.FullName?.StartsWith("Paramore.Brighter", true, CultureInfo.InvariantCulture) == false)); } @@ -67,7 +67,7 @@ public RequestHandlerBuilder AddHandler() return this; } - + /// /// Registers multiple synchronous handlers for a request type using custom routing /// @@ -77,18 +77,18 @@ public RequestHandlerBuilder AddHandler() /// /// Collection of handler types to register public RequestHandlerBuilder AddHandler( - Func> router, + Func> router, IEnumerable handlerTypes) where TRequest : class, IRequest { _syncRegistration += registry => { - registry.Register(router, handlerTypes); + registry.Register(router, handlerTypes); }; return this; } - + /// /// Registers an asynchronous handler for a specific request type /// @@ -106,7 +106,7 @@ public RequestHandlerBuilder AddHandlerAsync() return this; } - + /// /// Registers multiple asynchronous handlers for a request type using custom routing /// @@ -117,13 +117,13 @@ public RequestHandlerBuilder AddHandlerAsync() /// Collection of async handler types to register /// The builder instance for fluent chaining public RequestHandlerBuilder AddHandlerAsync( - Func> router, + Func> router, IEnumerable handlerTypes) where TRequest : class, IRequest { _asyncRegistration += registry => { - registry.RegisterAsync(router, handlerTypes); + registry.RegisterAsync(router, handlerTypes); }; return this; diff --git a/src/Fluent.Brighter/TransformerBuilder.cs b/src/Fluent.Brighter/TransformerBuilder.cs index 53b551d..8b58817 100644 --- a/src/Fluent.Brighter/TransformerBuilder.cs +++ b/src/Fluent.Brighter/TransformerBuilder.cs @@ -18,7 +18,7 @@ namespace Fluent.Brighter; public sealed class TransformerBuilder { private List _assemblies = []; - + /// /// Initializes a new TransformerBuilder instance /// @@ -29,12 +29,12 @@ public sealed class TransformerBuilder public TransformerBuilder() { _assemblies.AddRange(AppDomain.CurrentDomain.GetAssemblies().Where(a => - !a.IsDynamic - && a.FullName?.StartsWith("Microsoft.", true, CultureInfo.InvariantCulture) == false + !a.IsDynamic + && a.FullName?.StartsWith("Microsoft.", true, CultureInfo.InvariantCulture) == false && a.FullName?.StartsWith("System.", true, CultureInfo.InvariantCulture) == false && a.FullName?.StartsWith("Paramore.Brighter", true, CultureInfo.InvariantCulture) == false)); } - + /// /// Specifies specific assemblies to scan for message transformers ///