Conhece o padrão de projeto Mediator?

Fala pessoal, se vc é desenvolvedor ou arquiteto de sistemas deve conhecer esse design pattern, se não conhece recomendo fortemente que procure estudar sobre ele.

Lembrando que padrões de projeto são soluções já prontas e que foram testadas para determinadas situações que vc pode enfrentar no desenvolvimento do seu sistema.

Quais são as vantagens em utilizar o padrão Mediator? garantir o baixo acoplamento entre os componentes de uma aplicação. O padrão permite que um objeto se comunique com outro sem saber sua implementação, para que essa comunicação ocorra basta implementar um ponto central para orquestrar essa comunicação.

A vantagem é que os objetos utilizados nessa comunicação não precisam se conhecer

Na minha opinião esse projeto pode ajudar muito em uma refatoração quando:
-objetos se comunicam de forma especifica e complexa
-reutilização de um objeto se torna difícil, devido a quantidade de objetos que se comunica
-quando houver a necessidade de desacoplar seus componentes.

Este padrão é inclusive indicado pela Microsoft em seu material sobre desenvolvimento de microserviços que pode ser visto neste link: https://docs.microsoft.com/pt-br/dotnet/architecture/microservices/microservice-ddd-cqrs-patterns/microservice-application-layer-implementation-web-api , a imagem abaixo ilustra a utilização:

fonte: https://docs.microsoft.com/pt-br/dotnet/architecture/microservices/microservice-ddd-cqrs-patterns/microservice-application-layer-implementation-web-api

Para implementar esse padrão no mundo .NET existe uma biblioteca open source que pode ser baixada no NUGET chamada MediatR. (link do projeto: https://github.com/jbogard). Aproveito e já deixo meus parabéns para o desenvolvedor!

Criei um exemplo e disponibilizei no meu github (o link está no final do artigo), basicamente trata-se de uma web-api feita em .NET CORE 3.0, utilizei o Visual Studio 2019 para o desenvolvimento.

Abaixo os pacotes listados no nuget, instalei também o FluentValidation (para conhecer melhor visite: https://fluentvalidation.net/) para efetuar as validações nos objetos de entrada da API:

lista do nuget

No Mediatr temos alguns conceitos como commands, commandsHandlers, notifications e pipeline behaviors

  • commands – é a especificação dos parametros necessários para realizar a operação;
  • commandsHandlers – são os “resolvedores” ou seja recebem um command e efetua uma determinada operação;
  • notifications – classes que representam uma notificação para serem processadas por outras classes que esperam o tipo de ação da notificação;
  • pipeline behaviors – são ações que acontecem antes ou depois da chamada de um commandHandler.

Não vou entrar aqui na explicação de cada linha de código do exemplo, vou tentar explicar o fluxo básico de uma chamada, se tiverem mais dúvidas e só entrar em contato que será um prazer ajudar.

Abaixo o fluxo que acontece quando é acionado o controller da WEB API responsável por salvar uma entidade:

No primeiro passo (1) temos a implementação do controller da web-api, trata-se de uma operação de POST onde o método recebe um objeto do tipo CreatePersonCommand, um objeto simples com os dados de uma “pessoa” para inserção na base de dados, logo na primeira linha do método fazemos a chamada ao mediator enviando o comando;.

No segundo passo (2) configurei a aplicação para trabalhar com um pipeline behavior responsável por logar algo antes de chamar o handler e logar algo depois da operação realizada, você pode aqui utilizar o seu framework de log de preferência por exemplo.

No terceiro passo (3) depois de logar a entrada o pipeline de validação é acionado, seu papel é validar o command enviado, neste caso estou utilizando o FluentValidation para efetuar a validação, se passar pelas regras de validação o mediator irá para o passo 4, caso contrário volta ao controller com os erros de validação;

No quarto passo (4) está o handler, se chegar nesse passo o fluxo já passou pela validação do command, o papel do handler é aplicar as regras de negócio da operação e enviar a entidade para o banco, note que aqui eu verifico se foi “OK” a inserção, se positivo aciono o Handler de envio de email (5) para a pessoa cadastrada. Aqui eu acho muito interessante pois posso acionar vários handlers dependendo do meu negócio. O handler de email poderia por exemplo acionar uma mensagem em um message broker como o RabbitMQ e outro processo efetivamente enviar o e-mail… MUITO LEGAL ISSO!

Ao terminar o trabalho no handler o fluxo deve voltar a pipeline de log para logar o retorno e depois volta ao controller.

Óiaaaaaa

Aprender padrões como esse vai melhorar muito seu código e te ajudar a criar aplicações melhores.

Observe como ficou a solução, observe que a API ficou bem limpa como os controllers e os arquivos de configuração:

Visual Studio 2019

Os handlers e behaviors estão configurados (injetados) na classe Startup.cs:

Startup.cs

O código fonte deste exemplo como sempre se encontra no meu GitHub, baixe o mesmo tente entender mais a fundo a implementação e tendo dúvidas entre em contato!

Link do repositório: https://github.com/mdcarmo/example-mediator

Se vc gostou do artigo ou te ajudou comenta para fortalecer! ficou com dúvida? deixe também no comentários! Até o próximo artigo!

Leave a Reply

O seu endereço de e-mail não será publicado.