using MassTransit;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using TakeoutSaaS.Infrastructure.Identity.Persistence;
using TakeoutSaaS.Infrastructure.Logs.Consumers;
using TakeoutSaaS.Module.Messaging.Options;
namespace TakeoutSaaS.Infrastructure.Logs.Extensions;
///
/// 操作日志 Outbox 注册扩展。
///
public static class OperationLogOutboxServiceCollectionExtensions
{
///
/// 注册操作日志 Outbox 与消费者。
///
/// 服务集合。
/// 配置源。
/// 服务集合。
public static IServiceCollection AddOperationLogOutbox(this IServiceCollection services, IConfiguration configuration)
{
// 1. 读取 RabbitMQ 配置
var options = configuration.GetSection("RabbitMQ").Get();
if (options == null)
{
throw new InvalidOperationException("缺少 RabbitMQ 配置。");
}
// 2. 注册 MassTransit 与 Outbox
services.AddMassTransit(configurator =>
{
configurator.AddConsumer();
configurator.AddEntityFrameworkOutbox(outbox =>
{
outbox.UsePostgres();
outbox.UseBusOutbox();
});
configurator.UsingRabbitMq((context, cfg) =>
{
var virtualHost = string.IsNullOrWhiteSpace(options.VirtualHost) ? "/" : options.VirtualHost.Trim();
var virtualHostPath = virtualHost == "/" ? "/" : $"/{virtualHost.TrimStart('/')}";
var hostUri = new Uri($"rabbitmq://{options.Host}:{options.Port}{virtualHostPath}");
cfg.Host(hostUri, host =>
{
host.Username(options.Username);
host.Password(options.Password);
});
cfg.PrefetchCount = options.PrefetchCount;
cfg.ConfigureEndpoints(context);
});
});
// 3. 返回服务集合
return services;
}
}