ASP .NET Core - Transformando código síncrono para assíncrono - II
Hoje vamos continuar mostrando como transformar código síncrono para assíncrono na plataforma .NET. |
Continuando a primeira parte do artigo vamos iniciar a conversão do código usando async/await começando pela implementação do repositório.
Convertendo a implementação do Repositório
Como estamos
usando o Entity Framework Core temos a disposição todos os métodos assíncronos
para realizar a operação relacionada ao CRUD.
O EF Core fornece métodos como FindAsync(),
SaveChangesAsync(), AddRangeAsync(), AddAsync(), etc., que oferecem uma
maneira assíncrona de trabalhar com o contexto do EF Core. Assim na
conversão vamos usar esses métodos.
A primeira etapa deve ser redefinir o código da interface IProdutoRepository tornando-os assíncronos.
Para isso vamos usar a classe Task que representa uma operação assíncrona:
public interface IProdutoRepository { Task<IEnumerable<Produto>> GetProdutosAsync(); Task<Produto> GetProdutoAsync(int? id); Task<Produto> CreateAsync(Produto produto); Task<Produto> UpdateAsync(Produto produto); Task<Produto> RemoveAsync(Produto produto); } |
Usamos o sufixo Async no nome de cada contrato para evidenciar que eles devem ser implementados usando async/await.
A seguir vamos converter o código da classe ProdutoRepository incluindo as palavras-chave async/await e Task.
using API_Conversao.Context; using API_Conversao.Models; using Microsoft.EntityFrameworkCore; using System.Collections.Generic; using System.Threading.Tasks;
namespace API_Conversao.Repositories public
async Task<Produto> CreateAsync(Produto produto) public
async Task<Produto> GetProdutoAsync(int? id) public
async Task<IEnumerable<Produto>> GetProdutosAsync() public
async Task<Produto> RemoveAsync(Produto produto) public
async Task<Produto> UpdateAsync(Produto produto) |
Assim observe que na assinatura de cada método incluímos as palavras chaves async Task ou async Task<T>.
Também usamos os seguintes métodos do EF Core:
Conversão do controlador ProdutosController
Agora precisamos converter o código usado na implementação do controlador para assíncrono.
using API_Conversao.Models; using API_Conversao.Repositories; using Microsoft.AspNetCore.Mvc; using System.Collections.Generic; using System.Threading.Tasks;
namespace API_Conversao.Controllers public ProdutosController(IProdutoRepository produtoService) // api/produtos [HttpGet("{id}", Name = "GetProduto")] if (produto == null) [HttpPost] await _produtoRepository.CreateAsync(produto); return new CreatedAtRouteResult("GetProduto", [HttpPut("{id}")] await _produtoRepository.UpdateAsync(produto); return Ok(produto); [HttpDelete("{id}")] |
Com isso agora temos a implementação do repositório e do controlador usando a programação assíncrona com async/await e Task.
Pegue o projeto aqui: API_Conversao.zip (sem as referências)
"Disse-lhe Jesus: Porque me viste, Tomé, creste;
bem-aventurados os que não viram e creram."
João 20:29
Referências: