ASP.Net
Core
- Padrão repositório e Unit of Work com Dapper
![]() |
Hoje temos um tutorial mostrando como implementar o Padrão Repositório e o Unit of Work usando o Dapper no ambiente .NET Core. |
Para saber mais sobre o Dapper, o padrão Repositório e UnitOfWork consulte as referências no final do artigo.
O objetivo é mostrar como usar o Dapper para implementar o padrão Repository e o padrão Unit Of Work em uma Web API ASP.NET Core acessando o SQL Server.
Vamos iniciar criando o banco de dados TarefasDB e a seguir a tabela Tarefas :
USE TarefasDB GO CREATE TABLE [dbo].[Tarefas]( [Id] [int] IDENTITY(1,1) NOT NULL, [Nome] [nvarchar](100) NOT NULL, [Descricao] [nvarchar](50) NOT NULL, [Status] [int] NOT NULL, [ConcluidaEm] [datetime] NOT NULL, [CriadaEm] [datetime] NOT NULL, [ModificadaEm] [datetime] NULL ) |
Vamos gerenciar as informações sobre tarefas em uma API Rest.
Recursos usados:
Criando a Web API no VS 2019
Abra o VS 2019 Community e selecione : Create a new Project;
Selecione o template ASP.NET Core Web API;
Informe o nome do projeto - ApiTarefas e sua localização;
A seguir marque as opções conforme a figura a seguir:
Com o projeto criado vamos incluir as referências ao Dapper e ao System.Data.SqlClient no projeto.
Podemos fazer isso via menu Tools->..-> Manage Nuget Packages for Solution ou usando o comando Install-package <nome-pacote>
A seguir vamos criar uma pasta Models no projeto e nesta pasta a classe: Tarefa e a enumeração StatusTarefa que representam o nosso modelo de domínio:
1- Tarefa
public class Tarefa { public int Id { get; set; } public string Nome { get; set; } public string Descricao { get; set; } public StatusTarefa Status { get; set; } public DateTime ConcluindaEm { get; set; } public DateTime CriadaEm { get; set; } public DateTime? ModificadaEm { get; set; } } |
1- StatusTarefa
public enum StatusTarefa { Criada, Ativa, Concluida, Cancelada } |
Estamos usando uma classe POCO anêmica sem muita expressão porque estamos em um tutorial demo.
Definindo a sessão com o banco de dados e a string de conexão
Crie uma pasta Data no projeto e nesta pasta vamos criar a classe DBSession que vai obter a string de conexão , abrir e gerenciar a conexão com o banco de dados SQL Server:
using Microsoft.Extensions.Configuration; using System.Data; using System; using System.Data.SqlClient;
namespace ApiTarefas.Data |
Note que esta classe é marcada com o modificador sealed e dessa forma não poderá ser estendida. Fizemos isso para proteger o código pois ele é o coração da nossa implementação. Ela também implementa IDisposable de forma que poderemos sempre fechar a conexão e liberar os recursos usados.
Agora abra o arquivo appsettings.json e inclua a seção ConnectionStrings contendo a string de conexão com o banco de dados SQL Server:
{ "ConnectionStrings": { "DefaultConnection": "Data Source=;Initial Catalog=TarefasDB;Integrated Security=True" }, "Logging": { "LogLevel": { "Default": "Information", "Microsoft": "Warning", "Microsoft.Hosting.Lifetime": "Information" } }, "AllowedHosts": "*" } |
Implementando o padrão Repository
Para implementar o padrão Repository vamos criar uma pasta Repositories no projeto e a seguir criar as interfaces :
Vamos implementar um repositório genérico.
1- IGenericRepository
using System.Collections.Generic; using System.Threading.Tasks;
namespace ApiTarefas.Repositories |
2- ITarefaRepository
using ApiTarefas.Models; namespace ApiTarefas.Repositories { public interface ITarefaRepository : IGenericRepository<Tarefa> { } } |
Agora na mesma pasta vamos implementar a interface do repositório criando a classe concreta TarefaRepository:
3- TarefaRepository
using ApiTarefas.Data; using ApiTarefas.Models; using Dapper; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks;
namespace ApiTarefas.Repositories public TarefaRepository(DBSession db) var result = await _session.Connection.ExecuteAsync(sql, entity, _session.Transaction); public async Task<int> Delete(int id) public async Task<Tarefa> Get(int id) public async Task<IEnumerable<Tarefa>> GetAll() public async Task<int> Update(Tarefa entity) |
Implementando o Unit Of Work
Crie a pasta UnitofWork no projeto e nesta pasta crie a interface IUnitofWork e a seguir a classe concreta Unit_of_Work() que implementa esta interface:
1- IUnitofWork
using ApiTarefas.Repositories; using System; namespace ApiTarefas.UnitofWork |
2- Unti_of_Work
using ApiTarefas.Data; using ApiTarefas.Repositories;
namespace ApiTarefas.UnitofWork public void Commit() public void Rollback() public void Dispose() => _session.Transaction?.Dispose(); |
Criando o controlador TarefasController
Na pasta Controllers crie o controlador TarefasController com o código abaixo:
using ApiTarefas.Models; using ApiTarefas.UnitofWork; using Microsoft.AspNetCore.Mvc; using System.Collections.Generic; using System.Threading.Tasks;
namespace ApiTarefas.Controllers [HttpGet] [HttpGet("{id:int}")] [HttpPost] [HttpPut] [HttpDelete("{id:int}")] |
Injetamos o serviço UnitOfWork no construtor e com essa instância usamos as operações do repositório pertinente.
Antes de testar temos que registrar os serviços e as dependências no método ConfigureServices da classe Startup:
public void ConfigureServices(IServiceCollection services) { services.AddScoped<DBSession>(); services.AddTransient<ITarefaRepository, TarefaRepository>(); services.AddTransient<IUnitofWork, Unit_of_Work>(); services.AddControllers(); services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new OpenApiInfo { Title = "ApiTarefas", Version = "v1" }); }); } |
Executando o projeto teremos a exibição da interface do Swagger com os endpoints para as operações CRUD:
Podemos agora testar cada um dos endpoints para obter, incluir, alterar e excluir tarefas.
Pegue o projeto
aqui: ApiTarefas.zip (sem as
referências)
"Se o SENHOR não edificar a casa, em vão trabalham os que
a edificam; se o SENHOR não guardar a cidade, em vão vigia a sentinela."
Salmos 127:1
Referências:
ASP .NET Core 2 - MiniCurso Básico
ASP .NET Core MVC - CRUD básico com ADO .NET
ASP .NET Core - Implementando a segurança com
ASP .NET Core - Iniciando com ASP .NET Core MVC e
ASP .NET Core MVC - Criando um site com MySql e EF
ASP .NET Core - Gerenciador de Despesas Pessoais com
Minicurso ASP .NET Core 2.0 - Apresentando MVC - YouTube
ASP .NET Core - Configurando o ambiente de .
ASP .NET Core e EF Core - Configurando o ambiente
ASP .NET Core - Como configurar o AutoMapper