Open source

Suíte PMQ

downloads 3903ligações 12 apurado em 23/08/2026

Cinco bibliotecas públicas em .NET, extraídas de sistemas que já rodavam em produção e generalizadas. É a parte do meu trabalho que qualquer pessoa pode ler hoje, sem acordo de confidencialidade.

PacoteDownloadsO que resolve
PMQ.Notifications1.432regra de negócio violada como dado, não como exceção
PMQ.Mediator637mediator com pipeline de comportamento e validação
PMQ.ErrorHandling748resposta de erro padronizada em ASP.NET Core, RFC 9457
PMQ.Identity484autenticação agnóstica de provedor, OIDC ou JWT próprio
PMQ.Domain602blocos de DDD: entidade, agregado, objeto de valor, evento

De onde vieram

Mantendo dezenas de serviços .NET no mesmo parque, o mesmo conjunto de problemas reaparecia em cada um: como a regra de negócio reclama, como o caso de uso é despachado, como o erro chega ao cliente, quem é o chamador. Cada serviço resolvia do seu jeito, e nenhum jeito era igual ao outro.

Duplicação entre serviços não dói de imediato. Dói na hora de corrigir: um comportamento errado de tratamento de erro precisava ser corrigido em dezenas de lugares, cada um com uma variação. Já existiam bibliotecas compartilhadas internamente, mas amarradas a dependências da empresa e impossíveis de reaproveitar fora dela. Extraí as cinco abstrações, limpei as dependências internas e publiquei.

A tese

Não são cinco exercícios soltos. Juntos, são os blocos de uma Clean Architecture:

PMQ.Domain          →  o domínio: entidade, agregado, objeto de valor, evento
PMQ.Notifications   →  como a regra reclama, sem lançar exceção
PMQ.Mediator        →  como o caso de uso é despachado, com validação no caminho
PMQ.ErrorHandling   →  como o erro chega ao cliente HTTP
PMQ.Identity        →  quem é o chamador, independente de quem emite o token

Como as cinco peças se encaixam

O encaixe é a tese. A notificação que o domínio acumula é a mesma que o pipeline do mediator consulta antes de executar, e a mesma que o tratador de erro converte em resposta HTTP. Foi assim que a fraqueza aceita na ADR 2 — Notificação acumulada em vez de exceção, de que nada obriga o chamador a verificar, acabou resolvida estruturalmente: o pipeline verifica por todo mundo.

Decisões que eu defendo

Extrair depois do terceiro caso. Abstração criada na expectativa de reúso quase sempre está errada. Só o terceiro uso revela o que é essencial e o que era acidente do primeiro. Os cinco pacotes nasceram de código que já rodava em produção em mais de um serviço.

Notificação em vez de exceção. Regra de negócio violada é resultado previsto, não falha do programa. É a decisão que amarra a suíte, e o pacote que a implementa é o mais baixado dos cinco.

Padrão de mercado onde ele existe. O tratamento de erro segue RFC 9457 em vez de formato próprio. Inventar formato é custo para quem consome.

O caminho de uma abstração

O mediator interno da empresa nasceu para desacoplar módulos num serviço corporativo. Funcionou, foi adotado por outros sistemas, e a versão generalizada e limpa das dependências internas virou PMQ.Mediator. É o padrão que eu repito: resolver o problema concreto primeiro e extrair depois.

Por que isto importa no portfólio

O código corporativo é maior em volume e em complexidade, e ninguém de fora pode lê-lo. Estes cinco pacotes são verificáveis: o código está aberto, o histórico está público, e o número de downloads não depende da minha palavra.

Ver também

Modelagem de domínio, DDD e CQRS · Documentação e mapeamento de sistemas

Pablo Mickael Quevedo Senior Software Engineer · autor principal de 32 sistemas · Novo Hamburgo, RS

12 notas ligadas a esta

A vizinhança desta estrela no céu do portfólio.

Explorar a galáxia →