ASP .NET Core  5 - Implementando CQRS com Mediator - III


Neste artigo vamos continuar a implementação do CQRS - Command Query Responsibility Segregation usando o padrão Mediator.(Mediatr)

Continuando o artigo anterior vamos agora implementar o controlador CustomersController que vai usar os comandos e consultas que já criamos.

Criando o controlador CustomersController

Vamos criar o controlador CustomersController na pasta Controllers do projeto API.

Na pasta Commands vamos definir o primeiro Command criando a classe CreateCustomerCommand que vai adicionar um novo cliente:

using DemoMediator.Application.Services.Commands;
using DemoMediator.Application.Services.Queries;
using MediatR;
using Microsoft.AspNetCore.Mvc;
using System.Threading.Tasks;
namespace DemoMediator.API.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class CustomersController : ControllerBase
    {
        private IMediator _mediator;
        public CustomersController(IMediator mediator)
        {
            _mediator = mediator;
        }      
        [HttpPost]
        public async Task<IActionResult> Create(CreateCustomerCommand command)
        {
            var result = await _mediator.Send(command);
            return Ok(result);
        }

        [HttpGet]
        public async Task<IActionResult> GetAll()
        {
            var result = await _mediator.Send(new GetAllCustomersQuery());
            return Ok(result);
        }

        [HttpGet("{id}")]
        public async Task<IActionResult> GetById(int id)
        {
            var result = await _mediator.Send(new GetCustomerByIdQuery { Id = id });
            if (result == null) 
                return NotFound();
            else
                return Ok(result);
        }

        [HttpDelete("{id}")]
        public async Task<IActionResult> Delete(int id)
        {
            var result = await _mediator.Send(new DeleteCustomerByIdCommand { Id = id });
            return Ok(result);
        }
        [HttpPut("{id}")]
        public async Task<IActionResult> Update(int id, UpdateCustomerCommand command)
        {
            if (id != command.Id)
            {
                return BadRequest();
            }

            var result = await _mediator.Send(command);

            return Ok(result);
        }
    }
}

Vamos entender o código:

Note que neste controller estamos “injetando” a interface IMediator, isso foi feito para que seja possível enviar as requisições dos nossos objetos Command com o método Send que esta interface disponibiliza:

 var result = await _mediator.Send(command);

Neste contexto, o IMediator será a classe mediadora que através do método Send chama os command handlers que definimos, com base no objeto passado.

Temos aqui um uma separação clara das responsabilidades pois não precisamos injetar repositórios, serviços, etc. para o seu controlador porque tudo que você precisa é o próprio Mediador.

Isso garante que seus controladores permaneçam leves e focados inteiramente em lidar com solicitações e encaminhá-las para sua lógica de negócios.

Assim temos as seguintes definições :

Aqui para cada método HTTP estamos invocando um comando ou uma consulta pertinente à operação que desejamos realizar. Observe que não estamos considerando uma dependência do repositório e nem temos alguma ideia de como a consulta será tratada. Este é um dos princípios do padrão Mediator.

Obs:  Note que o Model Binding preencheu automaticamente os objetos Command (CreateCustomerCommand e UpdateCustomerCommand ) com base nos valores passados ​​na requisição HTTP.

Testando os Comandos e Consultas

Executando o projeto, como já temos a definição do Swagger configurada por padrão em nosso projeto API iremos obter a seguinte página no navegador:

A interface do Swagger expõe todos os nossos endpoints que poderão ser testados através desta interface.

Para isso basta clicar nos botões, a seguir clicar em - Try it out , e, incluir os parâmetros, quando necessários,  e clicar em Execute.

Teremos a exibição do response, do headers e o status code conforme mostra a figura abaixo para o GET api/customers:

Na próxima parte do artigo vamos continuar incluindo o recurso Notifications da MediatR.

Pegue o projeto aqui:  DemoMediator.zip (sem as referências)

(Disse Jesus) "E, se o teu olho te escandalizar, lança-o fora; melhor é para ti entrares no reino de Deus com um só olho do que, tendo dois olhos, seres lançado no fogo do inferno, Onde o seu bicho não morre, e o fogo nunca se apaga."
Marcos 9:47,48

Referências:


José Carlos Macoratti