Neste artigo, iremos aprender a implementar o “Mediatr”, uma biblioteca que utiliza o Design Pattern Mediator.
Antes de iniciar nosso artigo, gostaria de passar um “pente fino” no padrão Mediator. O que é o Mediator? Mediator é um padrão de projeto (Design Pattern) que encapsula como os objetos se interagem, ou seja, toda a comunicação entre os objetos é feito através do Mediator, no caso, o “Mediatr”, e evita que os objetos se refiram explicitamente, permitindo que você altere sua interação de forma independente.
Configuração inicial
Para utilizarmos o Mediatr, precisamos baixar via NUGET os seguintes pacotes:
Install-Package MediatR Install-Package MediatR.Extensions.Microsoft.DependencyInjection
Na primeira linha de comando, visto acima, instalamos a biblioteca principal, ou seja, todo o CORE se encontra neste pacote. Já na segunda linha de comando, instalamos o pacote para utilização com o ASP.NET Core, que inclui um método de extensão IServiceCollection.AddMediatR, permitindo que você registre via injeção de dependência todos os Handlers e Pre / PostProcessors.
Mão na massa
A biblioteca Mediatr possui duas formas de enviar mensagens / comandos.
- Mensagens de Request e Response para um único Handler;
- Mensagens que notificam vários Handlers.
Hoje iremos ver como utilizar o primeiro modelo citado acima.
Request / Response
As interfaces Request e Response podem ser utilizadas em cenários tanto de Commands (Insert, Update) como Queries (Get, GetById).
A seguir, iremos criar uma classe que representa a mensagem ou o comando que iremos solicitar:
<script src=“https://gist.github.com/miltoncamara/cb3b42531b7eec2194cf1255193107c2.js" ></script>
Notem que a classe Product “implementa” a interface IRequest<string>. Na verdade, essa interface é somente para agrupar os Request’s, e terá como retorno uma string, caso o comando seja do tipo void, não é necessário utilizar o tipo <string>, somente IRequest.
Agora, iremos criar a classe que irá receber a mensagem / comando para executar algum procedimento.
<script src="https://gist.github.com/miltoncamara/8d86c5ba5131fa251c6808b001f71d86.js" ></script>
Agora, percebam que a classe ProductHandler implementa a interface IRequestHandler<Product, string>, ou seja, passo o tipo Product que foi criado no passo anterior seguido do tipo do retorno e, em seguida, implemento o método Handler(Product message), que recebe como parâmetro o tipo Product, sendo assim, faço as validações necessárias e, em seguida, persisto a informação em algum repositório, ou faço qualquer outra operação desejada.
Depois de criado a classe que define o comando / mensagem e o handler que irá executar o procedimento a ser feito com a mensagem recebida, iremos criar a ProductController em nosso projeto ASP.NET Core. Neste exemplo, iremos demonstrar com Web Api.
<script src="https://gist.github.com/miltoncamara/fcfa7b14d7e849c5510dea79adfce4ce.js" ></script>
E para finalizar, iremos configurar a inicialização da biblioteca Mediatr, utilizando a extensão do IServiceCollection com o método AddMediatr.
<script src=“https://gist.github.com/miltoncamara/e931b04c181d9dc4f6ac9844e702f268.js" ></script>
Percebam que utilizei a extensão services.AddMediatr() dentro do método ConfigureServices, onde é configurado a injeção de dependência do serviço IMediatr em nossa aplicação.
Agora que temos tudo implementado e configurado, podemos efetuar o teste final. Como estou utilizando a Web API para exemplificar, irei utilizar o PostMan como ferramenta para efetuar os Request’s.
Como vocês podem ver, montei uma mensagem JSON para minha API, que espera como parâmetro via POST um produto do tipo Product. Após a Controller receber a requisição, o Mediatr “automagicamente” reconhece a mensagem e sabe para qual Handler a mesma será processada; legal né?! Imagine um cenário em que precisamos chamar vários serviços. Teríamos que declarar todas as referências na classe que iremos trabalhar. Dessa forma, utilizamos somente uma referência “_mediatr”, deixando tudo mais bonito e simples de trabalhar!
Link do projeto: https://github.com/miltoncamara/mediatr-netcore-sample
Espero que gostem do artigo e se tiverem alguma dúvida, deixe seu comentário que terei o maior prazer em respondê-lo!
Muito obrigado!