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:
ASP .NET Core - Implementando a segurança
ASP.NET Core MVC - Criando um Dashboard .
C# - Gerando QRCode - Macoratti
ASP .NET - Gerando QRCode com a API do Google
ASP .NET Core 3.1 - Entendendo CQRS
ASP .NET Core - Usando CQRS com MediatR
ASP .NET Core 5 - Implementando CQRS usando Mediator
ASP .NET Core - Implementando o Mediator com MediatR