A Fábrica de Arquitetos VII - Mediator Pattern + MediatR



...

Alôôôôôôôôôôô desenvolvedores, tudo bem? Eu estou de boa e no artigo de hoje vamos falar sobre o mediator pattern, um padrão que é muito utilizado principalmente em aplicações orientadas a eventos.

 

Além disso vou demonstrar como que uma simples implementação desse padrão pode se tornar uma implementação de CQRS, pegue seu café e vamos nessa!

 

 

O que é?

 

Frequência de uso: 4/5 — Médio Alto

O mediator, é um padrão da família dos comportamentais que facilita a comunicação entre diferentes objetos, através de uma classe que serve como mediadora, ou seja, temos um objeto que direciona as requisições (requests) para seu respectivo receptor (handler) e ele nos retorna uma resposta (response).

Vamos lá, imagine que você está construindo uma aplicação de loja virtual e no momento de finalizar o pedido, a classe responsável por gerar a nota fiscal necessita da lista de produtos do pedido que foi realizado, como evitar que a classe fiscal seja acoplada a classe de pedidos e produtos?

Simples, utilizando o padrão mediator para poder redirecionar nossa requisição para o seu devido receptor no qual ele irá nos devolver uma resposta.

Então seguindo o mesmo exemplo de nota fiscal dito acima, ao invés de referenciarmos a classe ou interface de pedidos e produtos podemos lançar requisições nas quais a classe mediator irá receber e nos retornar com os dados que precisamos.

Dessa forma evitamos o alto acoplamento entre 2 contextos diferentes.

Logo abaixo vou deixar o UML do padrão.

 

 

Mãos no Código!

 

Diferente dos outros artigos, o exemplo que vou utilizar aqui é diferente do exemplo mostrado no bloco acima.

O exemplo que irei utilizar é bem comum quando estamos trabalhando com aplicações orientadas a eventos, vamos criar nossa classe mediadora (mediator), que irá redirecionar as solicitações de criação e atualização de usuário, para isso vamos criar um repositório fake só para servir de exemplo.

OBS: Iremos implementar o padrão primeiramente sem nenhum pacote externo, logo após irei exemplificar com o MediatR.

Primeiro precisamos da nossa entidade User.cs.

 

Note que no segundo construtor utilizo da biblioteca Random para poder gerar Id’s aleatórios para a entidade.

Agora precisamos criar nosso repositório fake, UserRepository.cs e a interface no qual será implementada IUserRepository.cs.

IUserRepository.cs

 

UserRepository.cs

 

Beleza agora começa a brincadeira do mediator, precisamos primeiro entender que para cada chamada ela deve ter uma Request (conteúdo da requisição) no qual ele retorna para nós uma Response (conteúdo de resposta).

O conteúdo de requisição e de resposta pode ser algum tipo primitivo (string, bool, decimal) ou o mais comum, pode ser um objeto.

No nosso caso será um objeto para requisição e outro para resposta.

Bom primeiro vamos criar nossas classes de requisição.

CreateUserRequest.cs

 

UpdateUserRequest.cs

 

Por fim precisamos criar as classes de resposta.

 

CreateUserResponse.cs

 

UpdateUserResponse.cs

 

Show! Agora vamos criar nossa classe mediator que irá direcionar as requisições MediatorHandler.cs e sua devida interface IMediatorHandler.cs.

IMediatorHandler.cs

 

MediatorHandler.cs

 

OBS: Alguns arquitetos optam por criar um receptor (handler) por requisição, 

 

E agora?? como utilizar???????? Simples jovem dev, basta apenas você injetar através de injeção de dependência uma instância da interface IMediatorHandler, e criar a requisição que você deseja

No exemplo abaixo utilizei uma API em .NET 5 para consumir o mediator.

 

Perceba que ao invés de utilizar o repositório UserRepository diretamente, eu lanço uma requisição para o mediator, e a responsabilidade é passada inteiramente para a classe mediadora, evitando o alto acoplamento.

Ahhhhhh, caso esteja utilizando um modelo API do .NET Core não se esqueça de resolver as dependências no método ConfigureServices da Startup.cs.

 

 

MediatR

 

O MediatR é uma biblioteca do mundo .NET que já implementa o padrão Mediator, essa biblioteca também contém alguns recursos extras para quem deseja trabalhar com uma aplicação orientada a eventos.

É uma biblioteca bem famosa e é muito presente nos projetos mais atuais principalmente quando falamos sobre CQRS, então se você está buscando trabalhar com eventos ela é a biblioteca certa!

OBS: Se você não sabe ou nunca ouviu falar sobre CQRS recomendo esse artigo (https://www.eduardopires.net.br/2016/07/cqrs-o-que-e-onde-aplicar/).

 

Vamos lá, para início precisamos instalar o MediatR no nosso projeto, para isso use esse comando.

dotnet add package MediatR

 

Beleza, com o MediatR instalado precisamos adaptar nossas classes de requisição de acordo com o pacote.

 

CreateUserRequest.cs

 

UpdateUserRequest.cs

 

Note que ambas herdam da interface IRequest do MediatR, para informar ao pacote que elas são classes de requisição!

Então com nossas requisições alteradas precisamos criar uma nova classe mediadora, dessa vez utilizando os recursos que o MediatR nos provê.

 

MediatorHandler.cs

 

Se você observar bem, os códigos dos métodos são idênticos ao exemplo anterior, o que muda é nossa classe mediadora herda de IRequestHandler do pacote MediatR passando 2 parâmetros, onde o primeiro é o conteúdo da requisição e o segundo o conteúdo da resposta.

Por fim para testar também utilizei uma API criada em .NET 5.

 

Um detalhe que vale a pena ressaltar, recebemos via injeção de dependência uma instância de IMediator, interface do pacote MediatR.

Novamente, se estiver utilizando uma API do .NET não se esqueça de configurar as dependências!

 

 

Conclusão

 

Ufa! Hoje tentei demonstrar a implementação do Mediator, um padrão que vem ganhando popularidade por sua eficiência ao trabalhar com eventos, também tentei mostrar de forma simples como utilizar a biblioteca MediatR, espero que tenha ficado bem claro a implementação desse padrão!

Ahh, me desculpem pelo artigo grande, é só .NET mas eu gosto!

Agradeço a atenção e bons estudos!!!!!

Caso precise entrar em contato, me mande uma mensagem aqui.

Baixe o projeto clicando aqui.