ASP .NET Core -  CQRS e Mediator - II


Hoje vamos continuar a fazer uma breve revisão do CQRS - Command Query Responsibility Segregation e mostrar como a biblioteca MediatR pode nos ajudar quando tratamos com o CQRS.

Continuando o artigo anterior veremos agora os comandos ou Command MediatR.

MediatR : Commands

Para criar nosso primeiro Command ou “Comando”, vamos adicionar um Request que leva um único valor e atualiza nossa fonte de dados FakeData.

Dentro de nossa pasta “Commands”, vamos adicionar uma classe chamada AddValueCommand:

using DemoCQRS.Data;
using MediatR;
namespace DemoCQRS.Services.Commands
{
    public class AddValueCommand
    {
        public class Command : IRequest
        {
            public string Value { get; set; }
        }
        public class Handler : RequestHandler<Command>
        {
            private readonly FakeData _db;
            public Handler(FakeData db)
            {
                _db = db;
            }
            protected override void Handle(Command request)
            {
                _db.AddValue(request.Value);
            }
        }
    }
}

Vamos entender o código:

Primeiro, criamos a classe Command e implementando IRequest. Esse recurso vem da biblioteca MediatR.

A classe possui uma única propriedade para Value, que representará o valor que estamos adicionando. Observe que desta vez a assinatura IRequest não tem um parâmetro de tipo. Isso ocorre porque não estamos retornando um valor.

Em seguida, criamos a classe interna Handler, que herda da classe RequestHandler<Command>. Esta é uma implementação semelhante ao nosso GetValuesQuery.

Estamos simplesmente dizendo que esta classe irá lidar com a requisição de comando.

A seguir injetamos o serviço FakeData no construtor e em seguida, implementamos o método Handle (Command request), adicionando o valor à nossa fonte de dados.

Para testar a implementação do nosso Command vamos alterar o método Post do controlador TestesController:

...
        [HttpPost]
        public async Task Post([FromBody] string value)
        {
            await _mediator.Send(new Services.Commands.AddValueCommand.Command
            {
                Value = value
            });
        }
...

Fizemos da mesma forma que o método GET só que desta vez estamos definindo um valor em nosso Command e não retornarmos um valor.

Vamos pressionar CTRL + F5 para construir e executar nosso aplicativo, e devemos a interface do Swagger exibindo os endpoints definidos em nosso controlador TestesController:

Vamos acionar o endpoint POST /api/Testes que invocar o método AddValueCommand.

Para isso vamos informar o valor de uma string como : "2021"

E a seguir clicar em Execute onde iremos obter:

O código de status 200 indica que a execução ocorreu com sucesso.

Isso prova que nosso Comando está funcionando corretamente, enviando uma mensagem para a MediatR com nosso novo valor e atualizando o estado. Podemos então ver que nosso modelo de consulta (por exemplo, GetValues) foi atualizado com nosso novo valor.

Embora isso possa parecer simples na teoria, vamos pensar além do fato de que estamos simplesmente atualizando uma lista de strings na memória. O que estamos fazendo é nos comunicar a um armazenamento de dados por meio de construções de mensagem simples, sem ter nenhuma ideia de como isso está sendo implementado.

Os comandos e consultas podem apontar para diferentes armazenamentos de dados. Eles não sabem como sua solicitação será tratada e não se importam.

Neste ponto já temos uma aplicação Web API ASP.NET Core implementando os padrões CQRS + Mediator com MediatR.

Agora, na próxima parte do artigo vamos explorar as "Notificações" ou Notifications do MediatR.

"Aquele que diz: "Eu o conheço (Jesus)", mas não guarda os seus mandamentos, esse é mentiroso, e a verdade não está nele."
1 João 2:4

Referências:


José Carlos Macoratti