DEV Community

Cover image for Fluent Brighter: Uma Nova Forma de Configurar o Brighter V10
Rafael Andrade
Rafael Andrade

Posted on

Fluent Brighter: Uma Nova Forma de Configurar o Brighter V10

Após começar a trabalhar com o Brighter, encontrei desafios significativos com seu sistema de configuração. Para usuários de primeira viagem, a configuração do Brighter pode parecer confusa, excessivamente verbosa e sem uma API Fluente. Para resolver isso, criei o Fluent.Brighter — um pacote projetado para simplificar a configuração do Brighter através de uma interface fluente intuitiva.

Neste artigo, vou demonstrar como configurar o RabbitMQ usando o Fluent.Brighter.

O que é o Fluent.Brighter?

O Fluent.Brighter fornece uma API Fluente simplificada para a configuração do Brighter, inspirada em bibliotecas como MassTransit e JustSaying. Suas principais características incluem:

  • Configuração simplificada: Substitui configurações complexas por cadeias de métodos legíveis
  • Consolidação de pacotes: Módulos como Fluent.Brighter.Postgres agrupam componentes relacionados (Inbox, Outbox, DistributedLock e Messaging Gateway)
  • Cobertura progressiva: Embora ainda não suporte 100% dos recursos do Brighter, estamos expandindo ativamente o suporte para AWS, Microsoft SQL Server e documentação

Observação: Encontrou um problema ou tem sugestões? Por favor, abra uma issue no GitHub.

Requisitos

Recapitulação dos Conceitos Fundamentais do Brighter

Antes de mergulhar no Fluent.Brighter, vamos revisar os conceitos centrais do Brighter:

Requests (Comandos/Eventos)

Defina mensagens usando IRequest:

public class OrderPlaced : Event(Id.Random())
{
    public string OrderId { get; set; } = string.Empty;
    public decimal Value { get; set; }
}
Enter fullscreen mode Exit fullscreen mode
  • Comandos: Direcionados a um único destinatário (ex: SendEmailCommand)
  • Eventos: Notificações de broadcast (ex: OrderShippedEvent)

Message Mapper (Opcional)

Traduz entre mensagens do Brighter e objetos da aplicação (serialização JSON é o padrão):

public class OrderPlacedMapper : IAmAMessageMapper<OrderPlaced>, IAmAMessageMapperAsync<OrderPlaced>
{ 
    // Implementação
}
Enter fullscreen mode Exit fullscreen mode

Request Handler

Processa mensagens recebidas:

public class OrderPlacedHandler(ILogger<OrderPlacedHandler> logger) 
    : RequestHandler<OrderPlaced>
{
    public override OrderPlaced Handle(OrderPlaced command)
    {
        logger.LogInformation("Pedido {OrderId} realizado com valor {OrderValue}", 
            command.OrderId, command.Value);
        return base.Handle(command);
    }
}
Enter fullscreen mode Exit fullscreen mode

Configuração com o Fluent.Brighter

Comece registrando o serviço em seu container de DI:

services.AddFluentBrighter(opt => 
{
    // Configuração vai aqui
});
Enter fullscreen mode Exit fullscreen mode

1. Registrando Subscrições

Configure subscrições do RabbitMQ usando AddRabbitMqSubscription:

services.AddFluentBrighter(opt => 
{
    opt.Subscriptions(x => x
        .AddRabbitMqChannelFactory(new RmqMessagingGatewayConnection())
        .AddRabbitMqSubscription(new RmqSubscription(/*...*/))
        .AddRabbitMqSubscription(b => b
            .SetAmqp("amqp://guest:guest@localhost:5672")
            .SetExchange("paramore.brighter.exchange"))
    );
});
Enter fullscreen mode Exit fullscreen mode

2. Registrando Publicações

Configure publicações do RabbitMQ com AddRabbitMqPublication:

services.AddFluentBrighter(opt => 
{
    opt.Producers(opt => opt
        .AddRabbitMqPublication(rp => rp
            .SetConnection(new RmqMessagingGatewayConnection(/*...*/))
            .AddPublication(new RmqPublication { /*...*/ })
            .AddPublication(p => p.SetTopic("greeting.event.topic")))
    );
});
Enter fullscreen mode Exit fullscreen mode

3. Configuração Unificada do RabbitMQ

Use UsingRabbitMq para definir configurações de conexão uma única vez para todos os componentes:

services.AddFluentBrighter(brighter => brighter
    .UsingRabbitMq(rabbitmq => rabbitmq
        .SetConnection(conn => conn
            .SetAmqp("amqp://guest:guest@localhost:5672")
            .SetExchange("paramore.brighter.exchange"))
        .UsePublications(pb => pb
            .AddPublication<GreetingEvent>(p => p
                .SetTopic("greeting.event.topic")
                .CreateTopicIfMissing())
            .AddPublication<FarewellEvent>(p => p
                .SetTopic("farewell.event.topic")
                .CreateTopicIfMissing()))
        .UseSubscriptions(sb => sb
            .AddSubscription<GreetingEvent>(s => s
                .SetSubscription("paramore.example.greeting")
                .SetQueue("greeting.event.queue")
                .SetTopic("greeting.event.topic")
                .SetTimeout(TimeSpan.FromSeconds(200))
                .EnableDurable()
                .EnableHighAvailability())
            .AddSubscription<FarewellEvent>(s => s
                .SetSubscription("paramore.example.farewell")
                .SetQueue("farewell.event.queue")
                .SetTopic("farewell.event.topic")))));
Enter fullscreen mode Exit fullscreen mode

4. Registrando Componentes

O Fluent.Brighter faz varredura automática de assemblies por padrão, mas você pode registrar componentes manualmente:

services.AddFluentBrighter(brighter => brighter
    .Mappers(m => m.AddMapper<OrderPlaced, OrderPlacedMapper>())
    .RequestHandlers(rh => rh
        .AddHandler<OrderPlaced, OrderPlacedHandler>()
        .AddHandlerAsync<OrderShipped, OrderShippedHandlerAsync>()));
Enter fullscreen mode Exit fullscreen mode

Conclusão

O Fluent.Brighter reduz significativamente a complexidade de configuração do Brighter mantendo toda a funcionalidade. Ao adotar uma interface fluente e consolidar pacotes relacionados, ele diminui a curva de aprendizado para novos usuários e simplifica a configuração para desenvolvedores experientes.

Pronto para experimentar?

Exemplo completo de implementação no GitHub

Relate problemas ou contribua

Top comments (0)