DEV Community

Cover image for Brighter – Framework .NET para construção de aplicativos com mensageria
Rafael Andrade
Rafael Andrade

Posted on • Edited on

Brighter – Framework .NET para construção de aplicativos com mensageria

Se você precisa construir uma aplicação .NET que utilize filas ou streams, o Paramore Brighter é uma excelente opção. Baseado em padrões de integração empresarial, ele oferece flexibilidade e recursos avançados, como distributed lock e outbox patterns.

Projeto

Neste exemplo, vamos enviar e consumir mensagens usando Brighter com RabbitMQ. Pré-requisitos:

  • Podman (para executar o RabbitMQ)
  • .NET 8 ou 9

Pacotes Necessários

Instale os seguintes pacotes NuGet:

  • Paramore.Brighter.ServiceActivator: Para consumo de mensagens.
  • Paramore.Brighter.ServiceActivator.Extensions.DependencyInjection: Métodos úteis para registro do Brighter.
  • Paramore.Brighter.ServiceActivator.Extensions.Hosting: Suporte a execução de consumidores em segundo plano.
  • Paramore.Brighter.MessagingGateway.RMQ: Integração com RabbitMQ.

Definição de Mensagens

Todas as mensagens no Brighter devem implementar a interface IRequest.

  • Comandos: Têm um único consumidor e permitem resposta.
  • Eventos: Representam algo que já ocorreu e podem ter múltiplos consumidores.
public class Greeting(Guid id) : Event(id) { public string Name { get; set; } = string.Empty; } 
Enter fullscreen mode Exit fullscreen mode

Handlers

Handlers processam as mensagens de forma síncrona ou assíncrona.

public class GreetingHandler : RequestHandler<Greeting> { private readonly ILogger<GreetingHandler> _logger; public GreetingHandler(ILogger<GreetingHandler> logger) { _logger = logger; } public override Greeting Handle(Greeting request) { _logger.LogInformation("Olá, {Name}!", request.Name); return base.Handle(request); } } 
Enter fullscreen mode Exit fullscreen mode

Message mapper

O Brighter separa cabeçalho e corpo da mensagem, permitindo serialização personalizada (ex: JSON, gRPC).

public class GreetingMapper : IAmAMessageMapper<Greeting> { public Message MapToMessage(Greeting request) { var header = new MessageHeader(); header.Id = request.Id; header.TimeStamp = DateTime.UtcNow; header.Topic = "greeting.event"; header.MessageType = MessageType.MT_EVENT; var body = new MessageBody( JsonSerializer.Serialize(request, JsonSerialisationOptions.Options) ); return new Message(header, body); } public Greeting MapToRequest(Message message) { return JsonSerializer.Deserialize<Greeting>(message.Body.Bytes)!; } } 
Enter fullscreen mode Exit fullscreen mode

Configuração do Brighter

Registre os componentes do Brighter no HostBuilder:

services.AddHostedService<ServiceActivatorHostedService>() .AddServiceActivator(opt => {}) .AutoFromAssemblies(); // Auto-registra handlers e mappers 
Enter fullscreen mode Exit fullscreen mode

Configuração do RabbitMQ:

var rmqConnection = new RmqMessagingGatewayConnection { AmpqUri = new AmqpUriSpecification(new Uri("amqp://guest:guest@localhost:5672")), Exchange = new Exchange("paramore.brighter.exchange"), }; services.AddServiceActivator(opt => {}) .UseExternalBus(new RmqProducerRegistryFactory( rmqConnection, new RmqPublication[] { new() { MakeChannels = OnMissingChannel.Create, Topic = new RoutingKey("greeting.event"), } } ).Create()); 
Enter fullscreen mode Exit fullscreen mode

Configuração do Consumidor:

services.AddServiceActivator(opt => { opt.Subscriptions = new Subscription[] { new RmqSubscription<Greeting>( new SubscriptionName("paramore.example.greeting"), new ChannelName("greeting.event"), new RoutingKey("greeting.event"), makeChannels: OnMissingChannel.Create ) }; opt.ChannelFactory = new ChannelFactory( new RmqMessageConsumerFactory(rmqConnection) ); }); 
Enter fullscreen mode Exit fullscreen mode

Publicando uma Mensagem

var processor = host.Services.GetRequiredService<IAmACommandProcessor>(); processor.Post(new Greeting(Guid.NewGuid()) { Name = "Mundo" }); 
Enter fullscreen mode Exit fullscreen mode

Conclusão

O Paramore Brighter é uma ferramenta poderosa, mas exige familiaridade com padrões de Enterprise Integration Patterns para aproveitar todo seu potencial. Futuros artigos explorarão esses padrões e casos de uso avançados.

Referências

Documentação do Paramore Brighter
Exemplo Completo no GitHub

Top comments (0)