Utilizando o Pattern Mediator com o MediatR

5 jul

Fala Galera,

Hoje iremos falar sobre o padrão de projeto Mediator, esse padrão de projeto encapsula a forma como os objetos interagem entre eles, usando uma objeto intermediário para orquestrar suas chamadas e evitar que os objetos se refiram explicitamente permitindo que você altere sua interação de forma independente.

Para utilizar este padrão de projeto existe uma biblioteca open source chamada MediatR, que iremos usar para demonstrar o seu uso.

Setup Inicial

Para utilizar o MediatR basta adicionar o pacote via Nuget, vamos utilizar o comando abaixo para adicionar em nosso projeto.

Install-Package MediatR

 

Exemplo de utilização usando o Modelo Request/Response

A biblioteca MediatR contém algumas forma de se enviar mensagens, ou seja como os objetos vão interagir entre si.

Podemos utilizar um único handler ou podemos utilizar vários handlers para capturar as mensagens. Neste nosso exemplo vamos utilizar somente um único handler

As interfaces Request/Response são utilizadas para envios de mensagem/comando que serão tratados no nosso handler.

No exemplo abaixo, estou criando uma classe que representa uma mensagem.

public class Cliente  : IRequest<Cliente>
{
       public int Id { get; set; }
       public String Nome { get; set; }
       public String Email { get; set; }
       public String CPF { get; set; }
}

Notem que a classe implementa a interface IRequest e o tipo de retorno será a mesma classe cliente, pois a ideia é salvar o cliente no banco de dados. Neste nosso cenário vamos atribuir um valor na propriedade Id.

public class ClienteHandler : IRequestHandler<Cliente, Cliente>
    {
        public Cliente Handle(Cliente message)
        {
            if (String.IsNullOrEmpty(message.Email))
                throw new Exception("Email não pode estar vazio");

            message.Id = 1;

            //Salva no banco de dados;
            // Mais código //

            return message;
        }
    }

Como podem ver na implementação acima, recebemos a mensagem e na implementação do nosso handler que recebeu uma instancia de um cliente deverá salvar o objeto no banco de dados e retornar o objeto com o novo Id.

Agora vamos interligar as coisas, para isso vou usar um WebApi e simular um request para a API utilizando um container de injeção de dependência.

public class ClienteController : ApiController
{
   private IMediator Mediator { get; set; }

   public ClienteController(IMediator mediator)
   {
       this.Mediator = mediator;
   }

   public IHttpActionResult Post([FromBody]Cliente model)
   {
       var response = this.Mediator.Send(model);

       return Ok(response);
   }

}

Pronto com tudo interligado, nossa aplicação irá fazer um post para a API e o padrão mediator irá orquestrar todas as mensagens para o handler.

O código fonte deste artigo está no meu GitHub através deste link

Abs e até a próxima

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *