.NET

26 jul, 2017

Utilizando a biblioteca Mediatr com Asp .Net Core – Parte 01

Publicidade

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 MediatorMediator é 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.

  1. Mensagens de Request e Response para um único Handler;
  2. 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!

Referência