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
- .NET 8+ ou netstandard2.0
- Pacotes NuGet necessários:
-
Fluent.Brighter.RMQ.Async
(suporte ao RabbitMQ Client V7) -
Paramore.Brighter.ServiceActivator.Extensions.Hosting
(integração com Service Activator)
-
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; }
}
-
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
}
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);
}
}
Configuração com o Fluent.Brighter
Comece registrando o serviço em seu container de DI:
services.AddFluentBrighter(opt =>
{
// Configuração vai aqui
});
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"))
);
});
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")))
);
});
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")))));
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>()));
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)