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(_ => { });
}
}