{"id":28,"date":"2024-03-15T11:14:00","date_gmt":"2024-03-15T14:14:00","guid":{"rendered":"https:\/\/dumba.dev.br\/?p=28"},"modified":"2026-01-13T11:28:26","modified_gmt":"2026-01-13T14:28:26","slug":"vai-um-mediatr-ai","status":"publish","type":"post","link":"https:\/\/dumba.dev.br\/index.php\/2024\/03\/15\/vai-um-mediatr-ai\/","title":{"rendered":"Vai um MediatR ai?"},"content":{"rendered":"\n<p>Na maioria das vezes que vejo projetos utilizando Microsservi\u00e7os em .NET os arquitetos gostam de usar CQRS com o Mediator. Virou quase um&nbsp;<strong>default<\/strong>&nbsp;para utiliza\u00e7\u00e3o desse padr\u00e3o. E para utilizar o padr\u00e3o&nbsp;<a href=\"https:\/\/refactoring.guru\/pt-br\/design-patterns\/mediator\" target=\"_blank\" rel=\"noreferrer noopener\"><strong>Mediator<\/strong><\/a>&nbsp;faz o uso do famigerado pacote MediatR.<\/p>\n\n\n\n<p><em>Na minha humilde opini\u00e3o, est\u00e1 ai uma mistura complexa e atualmente mal utilizada (N\u00e3o me mate). Mas fica para um pr\u00f3ximo artigo.<\/em><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">O que \u00e9 o pacote MediatR?<\/h3>\n\n\n\n<p>O MediatR \u00e9 um componente criado por JBogard o mesmo cidad\u00e3o que criou o AutoMapper. Calma, n\u00e3o julgue ainda&#8230; o AutoMapper funciona! Tudo depende do contexto. \ud83d\ude00<\/p>\n\n\n\n<p><em>Voltando&#8230;.<\/em><\/p>\n\n\n\n<p>O MediatR implementa um padr\u00e3o muito top chamado Mediator. N\u00e3o faz parte desse artigo explicar o que \u00e9, mas diz o seguinte.<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>O Mediator \u00e9 um padr\u00e3o de projeto comportamental que permite que voc\u00ea reduza as depend\u00eancias ca\u00f3ticas entre objetos. O padr\u00e3o restringe comunica\u00e7\u00f5es diretas entre objetos e os for\u00e7a a colaborar apenas atrav\u00e9s do objeto mediador.<\/p>\n<\/blockquote>\n\n\n\n<h3 class=\"wp-block-heading\">Por que voc\u00ea gosta?<\/h3>\n\n\n\n<p>Para mim, a implementa\u00e7\u00e3o do padr\u00e3o Mediator \u00e9 perfeita, fazendo com que o acoplamento do c\u00f3digo seja m\u00ednimo. Com pouca configura\u00e7\u00e3o ja se consegue algo muito interessante. Segue o reposit\u00f3rio oficial &#8211; https:\/\/github.com\/jbogard\/MediatR.<\/p>\n\n\n\n<p>Gosto do uso fazendo com que o Handler seja minha camada de servi\u00e7os de aplica\u00e7\u00e3o ou casos de uso do projeto, fazendo com que para cada mudan\u00e7a de estado &#8220;Commands&#8221; seja separado por objetos diferentes. Cada a\u00e7\u00e3o com seu Handler com as regras de orquestra\u00e7\u00e3o.<br><\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"407\" height=\"377\" src=\"http:\/\/dumba.dev.br\/wp-content\/uploads\/2026\/01\/Pasted-image-20240531185819.png\" alt=\"\" class=\"wp-image-29\" srcset=\"https:\/\/dumba.dev.br\/wp-content\/uploads\/2026\/01\/Pasted-image-20240531185819.png 407w, https:\/\/dumba.dev.br\/wp-content\/uploads\/2026\/01\/Pasted-image-20240531185819-300x278.png 300w\" sizes=\"auto, (max-width: 407px) 100vw, 407px\" \/><\/figure>\n\n\n\n<p>Assim para cada contexto de atualiza\u00e7\u00e3o do estado de um dom\u00ednio eu tenho um&nbsp;<strong>Command<\/strong>, um&nbsp;<strong>Handler<\/strong>&nbsp;e um&nbsp;<strong>Response<\/strong>&nbsp;diferente.<\/p>\n\n\n\n<p>Uma outra situa\u00e7\u00e3o interessante \u00e9 quando podemos ter eventos ap\u00f3s qualquer mudan\u00e7a no sistema. Nesse mesmo projeto ao criar um Pedido deve &#8211; se lan\u00e7ar uma notifica\u00e7\u00f5es a algumas pessoas. Nesse caso, somente enviamos um Evento e o MediatR faz o papel de entregar ao handler ou handlers de evento correto. Funciona muito bem para disparar eventos a outros Microsservi\u00e7os ou Contextos.<\/p>\n\n\n\n<p>O uso correto faz com que se tenha um ganho de desacoplamento muito interessante.<br><em>Somente fazendo um parentese, eu n\u00e3o gosto do uso para Queries no caso do CQRS, uso direto mesmo com uma ServiceQuery ou QueryRepository. Simplifica a vida.<\/em><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Por que virou zona?<\/h3>\n\n\n\n<p>Assim como o uso de Microsservi\u00e7os em toda solu\u00e7\u00e3o existente o MediatR n\u00e3o ficou de fora. Virou modinha.<\/p>\n\n\n\n<p>Vejo algumas implementa\u00e7\u00f5es um tanto estranhas com MediatR.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Uso desmedido do pacote sem necessidade, por exemplo projetos muito pequenos com simples CRUD;<\/li>\n\n\n\n<li>Utiliza\u00e7\u00e3o do MediatR como uma camada de repeti\u00e7\u00e3o do reposit\u00f3rio, no meu ponto de vista com uma camada a mais sem sentido.<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"358\" src=\"http:\/\/dumba.dev.br\/wp-content\/uploads\/2026\/01\/Pasted-image-20240531192005-1024x358.png\" alt=\"\" class=\"wp-image-30\" srcset=\"https:\/\/dumba.dev.br\/wp-content\/uploads\/2026\/01\/Pasted-image-20240531192005-1024x358.png 1024w, https:\/\/dumba.dev.br\/wp-content\/uploads\/2026\/01\/Pasted-image-20240531192005-300x105.png 300w, https:\/\/dumba.dev.br\/wp-content\/uploads\/2026\/01\/Pasted-image-20240531192005-768x268.png 768w, https:\/\/dumba.dev.br\/wp-content\/uploads\/2026\/01\/Pasted-image-20240531192005-1536x537.png 1536w, https:\/\/dumba.dev.br\/wp-content\/uploads\/2026\/01\/Pasted-image-20240531192005-2048x716.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Mult eventos desconexos.<br>Ao lan\u00e7ar um evento segue disparando para outros eventos totalmente aleat\u00f3rios, deixando o c\u00f3digo extremamente complexo e dif\u00edcil at\u00e9 mesmo de debugar e avaliar.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Conclus\u00e3o<\/h3>\n\n\n\n<p>Eu particularmente, gosto do pacote MediatR pela facilidade que ele implementa o padr\u00e3o Mediator, mas vejo muitos projetos usando como bala de prata e para tudo o pacote \u00e9 aplicado. Mesmo em projetos pequenos, no qual n\u00e3o concordo muito com o uso, mas se bem empregado deixa o c\u00f3digo mais leg\u00edvel.<\/p>\n\n\n\n<p>Segue o&nbsp;<a href=\"https:\/\/github.com\/danilodumba\/locamoto\" target=\"_blank\" rel=\"noreferrer noopener\">GitHub<\/a>&nbsp;de um projeto que criei no qual exemplifica a forma como eu uso. Fique a vontade para discordar e dar sugest\u00f5es. Falei bobagem? Manda ai bora ajustar conhecimentos.<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>Lembre &#8211; se! Software de qualidade \u00e9 aquele que deixa seu cliente satisfeito.<\/p>\n<\/blockquote>\n\n\n\n<h3 class=\"wp-block-heading\">Refer\u00eancias<\/h3>\n\n\n\n<p>https:\/\/github.com\/danilodumba\/locamoto<br>https:\/\/github.com\/jbogard\/MediatR<br>https:\/\/refactoring.guru\/pt-br\/design-patterns\/mediator<br>https:\/\/www.youtube.com\/watch?v=AyUStsqmGK8<br>https:\/\/macoratti.net\/21\/11\/c_mediator1.htm#:~:text=Segundo%20a%20defini\u00e7\u00e3o%20da%20Gang,sua%20intera\u00e7\u00e3o%20de%20forma%20independente.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Na maioria das vezes que vejo projetos utilizando Microsservi\u00e7os em .NET os arquitetos gostam de usar CQRS com o Mediator. Virou quase um&nbsp;default&nbsp;para utiliza\u00e7\u00e3o desse padr\u00e3o. E para utilizar o padr\u00e3o&nbsp;Mediator&nbsp;faz o uso do famigerado pacote MediatR. Na minha humilde opini\u00e3o, est\u00e1 ai uma mistura complexa e atualmente mal utilizada (N\u00e3o me mate). Mas fica [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":32,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[11,12],"tags":[13,4],"class_list":["post-28","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-arquitetura","category-dicas","tag-arquitetura","tag-c"],"_links":{"self":[{"href":"https:\/\/dumba.dev.br\/index.php\/wp-json\/wp\/v2\/posts\/28","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/dumba.dev.br\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/dumba.dev.br\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/dumba.dev.br\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/dumba.dev.br\/index.php\/wp-json\/wp\/v2\/comments?post=28"}],"version-history":[{"count":4,"href":"https:\/\/dumba.dev.br\/index.php\/wp-json\/wp\/v2\/posts\/28\/revisions"}],"predecessor-version":[{"id":38,"href":"https:\/\/dumba.dev.br\/index.php\/wp-json\/wp\/v2\/posts\/28\/revisions\/38"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/dumba.dev.br\/index.php\/wp-json\/wp\/v2\/media\/32"}],"wp:attachment":[{"href":"https:\/\/dumba.dev.br\/index.php\/wp-json\/wp\/v2\/media?parent=28"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dumba.dev.br\/index.php\/wp-json\/wp\/v2\/categories?post=28"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dumba.dev.br\/index.php\/wp-json\/wp\/v2\/tags?post=28"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}