Padrão Repository com Entity Framework Core em APIs ASP.NET Core
7/3/2024, às 8:34:34

O que é o Padrão Repository?

O padrão Repository é um padrão de projeto comum que separa as camadas de acesso a dados e de negócios em uma aplicação. Ele oferece uma interface entre os dados armazenados em um banco de dados e a lógica de negócios da aplicação.

Por que Usar o Padrão Repository com Entity Framework Core em APIs ASP.NET Core?

  1. Separação de Responsabilidades: Isola o código de acesso a dados, facilitando testes e manutenção.
  2. Flexibilidade: Permite trocar o provedor de dados sem afetar a lógica de negócios.
  3. Organização: Organiza melhor o código, tornando-o mais legível e escalável.


Passo 1: Configurar o Projeto ASP.NET Core

1.1 Criar um Novo Projeto ASP.NET Core

Crie um novo projeto ASP.NET Core com suporte a APIs.

dotnet new webapi -o RepositoryPatternDemo
cd RepositoryPatternDemo


1.2 Instalar o Entity Framework Core

Adicione os pacotes do Entity Framework Core ao projeto.

dotnet add package Microsoft.EntityFrameworkCore.SqlServer
dotnet add package Microsoft.EntityFrameworkCore.Design


Passo 2: Criar os Modelos e Contexto de Dados

2.1 Criar o Modelo de Dados

Crie uma classe de modelo que represente uma entidade do banco de dados.

public class Product
{
public int Id { get; set; }
public string Name { get; set; }
public decimal Price { get; set; }
}


2.2 Configurar o DbContext

Configure o DbContext para interagir com o banco de dados.

using Microsoft.EntityFrameworkCore;

public class AppDbContext : DbContext
{
public AppDbContext(DbContextOptions<AppDbContext> options)
: base(options)
{
}

public DbSet<Product> Products { get; set; }
}


Passo 3: Implementar o Repositório

3.1 Criar a Interface IRepository

Crie uma interface genérica para o repositório.

public interface IRepository<T> where T : class
{
Task<IEnumerable<T>> GetAll();
Task<T> GetById(int id);
Task Create(T entity);
Task Update(T entity);
Task Delete(int id);
}


3.2 Implementar o Repositório Genérico

Implemente uma classe que implemente a interface IRepository usando o Entity Framework Core.

using Microsoft.EntityFrameworkCore;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

public class Repository<T> : IRepository<T> where T : class
{
private readonly AppDbContext _context;
private readonly DbSet<T> _dbSet;

public Repository(AppDbContext context)
{
_context = context;
_dbSet = _context.Set<T>();
}

public async Task<IEnumerable<T>> GetAll()
{
return await _dbSet.ToListAsync();
}

public async Task<T> GetById(int id)
{
return await _dbSet.FindAsync(id);
}

public async Task Create(T entity)
{
await _dbSet.AddAsync(entity);
await _context.SaveChangesAsync();
}

public async Task Update(T entity)
{
_dbSet.Attach(entity);
_context.Entry(entity).State = EntityState.Modified;
await _context.SaveChangesAsync();
}

public async Task Delete(int id)
{
var entity = await _dbSet.FindAsync(id);
if (entity != null)
{
_dbSet.Remove(entity);
await _context.SaveChangesAsync();
}
}
}


Passo 4: Usar o Repositório no Controlador

4.1 Injetar o Repositório no Controlador

Injete o repositório genérico no controlador e use-o para acessar os dados.

using Microsoft.AspNetCore.Mvc;
using System.Collections.Generic;
using System.Threading.Tasks;

[Route("api/[controller]")]
[ApiController]
public class ProductsController : ControllerBase
{
private readonly IRepository<Product> _repository;

public ProductsController(IRepository<Product> repository)
{
_repository = repository;
}

// GET: api/Products
[HttpGet]
public async Task<ActionResult<IEnumerable<Product>>> GetProducts()
{
var products = await _repository.GetAll();
return Ok(products);
}

// GET: api/Products/5
[HttpGet("{id}")]
public async Task<ActionResult<Product>> GetProduct(int id)
{
var product = await _repository.GetById(id);

if (product == null)
{
return NotFound();
}

return Ok(product);
}

// POST: api/Products
[HttpPost]
public async Task<IActionResult> PostProduct(Product product)
{
await _repository.Create(product);
return CreatedAtAction(nameof(GetProduct), new { id = product.Id }, product);
}

// PUT: api/Products/5
[HttpPut("{id}")]
public async Task<IActionResult> PutProduct(int id, Product product)
{
if (id != product.Id)
{
return BadRequest();
}

await _repository.Update(product);
return NoContent();
}

// DELETE: api/Products/5
[HttpDelete("{id}")]
public async Task<IActionResult> DeleteProduct(int id)
{
await _repository.Delete(id);
return NoContent();
}
}


Conclusão

Implementar o padrão Repository com o Entity Framework Core em APIs ASP.NET Core oferece uma maneira organizada e eficiente de acessar e manipular dados. Isso melhora a manutenção, testabilidade e escalabilidade do código, mantendo a lógica de negócios separada da camada de acesso a dados.


VOCÊ PODE GOSTAR

^

voltar para o top