using System; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; using Svrnty.CQRS.Configuration; using Svrnty.CQRS.Sagas.Abstractions.Messaging; namespace Svrnty.CQRS.Sagas.RabbitMQ; /// /// Extensions for adding RabbitMQ saga transport to the CQRS pipeline. /// public static class CqrsBuilderExtensions { /// /// Uses RabbitMQ as the message transport for sagas. /// /// The CQRS builder. /// Configuration action for RabbitMQ options. /// The CQRS builder for chaining. public static CqrsBuilder UseRabbitMq(this CqrsBuilder builder, Action configure) { var options = new RabbitMqSagaOptions(); configure(options); builder.Services.Configure(opt => { opt.HostName = options.HostName; opt.Port = options.Port; opt.UserName = options.UserName; opt.Password = options.Password; opt.VirtualHost = options.VirtualHost; opt.CommandExchange = options.CommandExchange; opt.ResponseExchange = options.ResponseExchange; opt.QueuePrefix = options.QueuePrefix; opt.DurableQueues = options.DurableQueues; opt.PrefetchCount = options.PrefetchCount; opt.ConnectionRetryDelay = options.ConnectionRetryDelay; opt.MaxConnectionRetries = options.MaxConnectionRetries; }); // Replace the default message bus with RabbitMQ implementation builder.Services.RemoveAll(); builder.Services.AddSingleton(); // Add hosted service for connection management builder.Services.AddHostedService(); return builder; } /// /// Uses RabbitMQ as the message transport for sagas with default options. /// /// The CQRS builder. /// The CQRS builder for chaining. public static CqrsBuilder UseRabbitMq(this CqrsBuilder builder) { return builder.UseRabbitMq(_ => { }); } }